无需设置委托即可启用同时手势-Swiftui ViewController

问题描述 投票:0回答:1

为了处理swiftui视图后面的金属视图上的手势,我在金属视图上添加了一些手势识别器。

在swiftui上没有手势也会在金属视图上触发手势识别器,我无法设置识别器委托。

但是,如果没有在识别器上设置委托,我将无法实现同时识别器功能(shouldRecognizeSimultaneouslyWith。

如何在不使用此功能的情况下启用多个手势识别器?

extension ViewController {
    let pan = UIPanGestureRecognizer(target: self,action: #selector(handlePan(gesture:)))
    pan.allowedTouchTypes = [NSNumber(value: UITouch.TouchType.direct.rawValue)]
    pan.delegate = self
    view.addGestureRecognizer(pan)

    let pinch = UIPinchGestureRecognizer(target: self,action: #selector(handlePinch(gesture:)))
    pinch.allowedTouchTypes = [NSNumber(value: UITouch.TouchType.direct.rawValue)]
    pinch.delegate = self
    view.addGestureRecognizer(pinch)

    let rotate = UIRotationGestureRecognizer(target: self, action: #selector(handleRotate(gesture:)))
    rotate.allowedTouchTypes = [NSNumber(value: UITouch.TouchType.direct.rawValue)]
    rotate.delegate = self
    view.addGestureRecognizer(rotate)
}

class ViewController: UIGestureRecognizerDelegate {

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    if (gestureRecognizer is UIPanGestureRecognizer || gestureRecognizer is UIRotationGestureRecognizer) {
        return true
    } else {
        return false
    }

   let swiftUIView = SwiftUIView()

    // Create a hosting controller with the swiftui
    let viewCtrl = UIHostingController(rootView: swiftUIView)
    self.addChild(viewCtrl)

    // Add SwiftUI as subview to Metal:
    metalView.addSubview(viewCtrl.view)
}
ios swift swiftui uigesturerecognizer
1个回答
0
投票

[当用户在swiftui视图内点击时,手势识别器会在父视图不应触发。您知道问题出在哪里吗?

为此,它需要提供以下委托方法

extension ViewController: UIGestureRecognizerDelegate {

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, 
           shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true 
    }

    // .. your other code here
}
© www.soinside.com 2019 - 2024. All rights reserved.