如果视图注册平移手势,则捏合手势不起作用

Posted

技术标签:

【中文标题】如果视图注册平移手势,则捏合手势不起作用【英文标题】:Pinch gesture does not work if view registers pan gesture 【发布时间】:2021-07-06 11:13:42 【问题描述】:

我有一个通过手势操作视图的应用程序。视图连接到平移、捏合和旋转手势。如果我开始用两根手指与视图交互,所有手势都会同时工作(预期行为)。但是,如果您从一根手指平移开始,则捏合和旋转手势将不起作用。当我在平移时尝试开始捏合或旋转时,不会调用委托中的任何方法。

shouldRecognizeSimultaneouslyWith

总是正确的。

预期行为,

    一个手指在视图上平移 添加第二根手指并开始捏合/旋转交互 (类似于 Instagram 故事编辑器)

【问题讨论】:

您是否也尝试过使用gestureRecognizerShouldBegin @MaticOblak 是的,即使我总是把它设为 true,它也不起作用。我相信在一个手指到两个手指手势之间切换存在问题。似乎无法识别第二根手指触摸。 【参考方案1】:

我从一个干净的项目中添加了以下内容:

class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        view.addGestureRecognizer(
            let gesture = UIPanGestureRecognizer(target: self, action: #selector(onPan))
            gesture.delegate = self
            return gesture
        ())
        view.addGestureRecognizer(
            let gesture = UIPinchGestureRecognizer(target: self, action: #selector(onPinch))
            gesture.delegate = self
            return gesture
        ())
        view.addGestureRecognizer(
            let gesture = UIRotationGestureRecognizer(target: self, action: #selector(onRotate))
            gesture.delegate = self
            return gesture
        ())
    
    
    @objc private func onPan(_ sender: UIPanGestureRecognizer) 
        print("Did pan to \(sender.translation(in: sender.view))")
    
    
    @objc private func onPinch(_ sender: UIPinchGestureRecognizer) 
        print("Did pinch to \(sender.scale)")
    
    
    @objc private func onRotate(_ sender: UIRotationGestureRecognizer) 
        print("Did rotate to: \(sender.rotation)")
    




extension ViewController: UIGestureRecognizerDelegate 
    
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool  true 
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool  true 
    

在您描述的场景之后,所有 3 种方法都会报告更改:

我从单点拖动手势开始 我按了另一根手指并开始旋转手势和捏合手势

这个例子已经不适合你了吗?您遇到的行为是什么以及预期的行为是什么?

【讨论】:

您的示例确实有效。但是,代码中的问题在于我的控制器中的视图层次结构损坏。

以上是关于如果视图注册平移手势,则捏合手势不起作用的主要内容,如果未能解决你的问题,请参考以下文章

当从视图启用滚动时,SWRevealViewController 平移手势不起作用

UI 平移手势不起作用

我已经隐藏了导航栏和状态栏,现在屏幕边缘平移手势返回不起作用,这是典型的吗?

如果在目标 c 中使用手势,didSelectItemAtIndexPath 不起作用

添加手势后SwiftUI TextField不起作用

UIImageView 上的捏合、平移和双击手势