Home > database >  How do restrict pan gesture recognizers to when a pinch gesture is occurring?
How do restrict pan gesture recognizers to when a pinch gesture is occurring?

Time:12-01

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
}

CodePudding user response:

You ca use require(toFail:)

as example if you have two gestures tap and swipe

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:

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)

CodePudding user response:

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.

  • Related