简体   繁体   English

如何将平移手势识别器限制在捏手势发生时?

[英]How do restrict pan gesture recognizers to when a pinch gesture is occurring?

How do you only accept pan gestures when the user is in the process of a pinch gesture?当用户处于捏合手势的过程中时,您如何只接受平移手势? In other words, I'd like to avoid delivering one finger pan gestures.换句话说,我想避免提供单指平移手势。

@IBAction func pinchPiece(_ pinchGestureRecognizer: UIPinchGestureRecognizer) {
    guard pinchGestureRecognizer.state == .began || pinchGestureRecognizer.state == .changed,
          let piece = pinchGestureRecognizer.view else {
            // After pinch releases, zoom back out.
            if pinchGestureRecognizer.state == .ended {
              UIView.animate(withDuration: 0.3, animations: {
                pinchGestureRecognizer.view?.transform = CGAffineTransform.identity
              })
            }
            return
    }
    adjustAnchor(for: pinchGestureRecognizer)
    
    let scale = pinchGestureRecognizer.scale
    piece.transform = piece.transform.scaledBy(x: scale, y: scale)
    pinchGestureRecognizer.scale = 1 // Clear scale so that it is the right delta next time.
}

@IBAction func panPiece(_ panGestureRecognizer: UIPanGestureRecognizer) {
    guard panGestureRecognizer.state == .began || panGestureRecognizer.state == .changed,
          let piece = panGestureRecognizer.view else {
        return
    }
    let translation = panGestureRecognizer.translation(in: piece.superview)
    piece.center = CGPoint(x: piece.center.x + translation.x, y: piece.center.y + translation.y)
    panGestureRecognizer.setTranslation(.zero, in: piece.superview)
}

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

You ca use require(toFail:)你可以使用require(toFail:)

as example if you have two gestures tap and swipe例如,如果您有两个手势tapswipe

A swipe gesture is a tap followed by a linear movement, whereas a tap is just a tap – we need to make sure the swipe gesture has definitely not been recognizer before the tap gesture is checked.轻扫手势是轻击之后的线性移动,而轻击只是轻击——我们需要确保轻扫手势在检查轻击手势之前绝对没有被识别器识别。

iOS often does a fairly good job of this, but there's no need to leave it up to chance: if you call require(toFail:) on the tap gesture recognizer, passing in the swipe recognizer, iOS will definitely make sure they don't compete: iOS 通常在这方面做得相当好,但没有必要让它靠运气:如果你在点击手势识别器上调用 require(toFail:) ,传入滑动识别器,iOS 肯定会确保他们不会竞争:

let swipe = UISwipeGestureRecognizer(target: self, action: #selector(executeSwipe))
let tap = UITapGestureRecognizer(target: self, action: #selector(executeTap))

view.addGestureRecognizer(swipe)
view.addGestureRecognizer(tap)

tap.require(toFail: swipe)

You can enable and disable your gesture easily.您可以轻松启用和禁用手势。 When it starts pinching then disable the pan gesture and enable it when it ends pinching.当它开始捏时禁用平移手势并在结束捏时启用它。 When it starts pan then disable pinch gesture and enable it when end pan.当它开始平移时,禁用捏合手势并在结束平移时启用它。

@IBAction func pinchPiece(_ pinchGestureRecognizer: UIPinchGestureRecognizer) {
    guard pinchGestureRecognizer.state == .began || pinchGestureRecognizer.state == .changed,
          let piece = pinchGestureRecognizer.view else {
             yourPangesture.isEnable = false // Disable Pangesture
            // After pinch releases, zoom back out.
            if pinchGestureRecognizer.state == .ended {
              UIView.animate(withDuration: 0.3, animations: {
                pinchGestureRecognizer.view?.transform = CGAffineTransform.identity
              })
            }
            return
    }
    if pinchGestureRecognizer.state == .end {
         yourPangesture.isEnable = true  // Enabling again
    }
    adjustAnchor(for: pinchGestureRecognizer)
    
    let scale = pinchGestureRecognizer.scale
    piece.transform = piece.transform.scaledBy(x: scale, y: scale)
    pinchGestureRecognizer.scale = 1 // Clear scale so that it is the right delta next time.
}

Do the same for panPiece funtion.对 panPiece 函数执行相同的操作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM