【问题标题】:Using multiple UIGestureRecognizers simultaneously like UIRotationGestureRecognizer & UIPanGestureRecognizer in Swift 3在 Swift 3 中同时使用多个 UIGestureRecognizer,例如 UIRotationGestureRecognizer 和 UIPanGestureRecognizer
【发布时间】:2017-06-10 14:33:26
【问题描述】:

在 iOS 上的现代用户界面中,在单个视图上实现多个 UIGestureRecognizer 通常很有用,以便为模拟现实世界的显示对象提供更真实的行为。

例如,您可能希望既能在屏幕上拖动视图,又能用两根手指旋转它。

UIGestureRecognizerDelegate 为此提供了一个可选函数shouldRecognizeSimultaneouslyWith。返回true 可以避免一次只有一个手势生效:

// MARK: - UIGestureRecognizerDelegate
extension GestureController: UIGestureRecognizerDelegate {

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

但是,当多个手势识别器处于活动状态时,尤其是UIRotationGestureRecognizer,当处理程序不断地相互覆盖时,发现视图行为异常可能会令人沮丧。

如何实现多个手势识别器以提供流畅的行为?

【问题讨论】:

    标签: ios swift uigesturerecognizer uipangesturerecognizer


    【解决方案1】:

    同时实现多个手势识别器的关键是修改它们的CGAffineTransforms,而不是覆盖它们。

    Apple > Documentation > Core Graphics > CGAffineTransform:

    请注意,您通常不需要直接创建仿射变换。例如,如果您只想绘制缩放或旋转的对象,则无需构造仿射变换即可。操作绘图的最直接方法(无论是通过移动、缩放还是旋转)是调用函数 translateBy(x:y:) , scaleBy(x:y:) , 或者 旋转(通过:) , 分别。如果您想稍后重用它,您通常应该只创建一个仿射变换。

    此外,当检测到更改时,在应用翻译后,重置发送者的值很重要,这样翻译就不会在每次检测到时复合。

    例如:

    @IBAction func rotateAction(_ sender: UIRotationGestureRecognizer) {
        guard let view = sender.view else { return }
    
        switch sender.state {
        case .changed:
            view.transform = view.transform.rotated(by: sender.rotation)
            sender.rotation = 0
        default: break
        }
    }
    

    @IBAction func panAction(_ sender: UIPanGestureRecognizer) {
        guard let view = sender.view else { return }
    
        switch sender.state {
        case .changed:
            let translationX = sender.translation(in: view).x
            let translationY = sender.translation(in: view).y
    
            view.transform = view.transform.translatedBy(x: translationX, y: translationY)
            sender.setTranslation(CGPoint.zero, in: view)
        default: break
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多