iOS开发:如何限制平移手势仅在捏合手势进行时响应
实现方案
要实现仅捏合过程中响应平移、拦截单指平移的需求,按以下步骤修改代码即可:
步骤说明
- 新增类级别的状态变量,记录捏合手势的当前执行状态
- 在捏合手势的生命周期回调中同步更新状态变量
- 平移手势执行前增加状态校验,仅捏合进行中才触发平移逻辑
- 可选补充:给平移手势设置
minimumNumberOfTouches = 2,从手势触发层面拦截单指操作,双重保障
修改后完整代码
// 新增:记录当前是否处于捏合操作中 var isPinching = false @IBAction func pinchPiece(_ pinchGestureRecognizer: UIPinchGestureRecognizer) { // 捏合开始时标记状态 if pinchGestureRecognizer.state == .began { isPinching = true } // 捏合结束/失败/取消时重置状态 if [.ended, .cancelled, .failed].contains(pinchGestureRecognizer.state) { isPinching = false UIView.animate(withDuration: 0.3, animations: { pinchGestureRecognizer.view?.transform = CGAffineTransform.identity }) return } guard pinchGestureRecognizer.state == .changed, let piece = pinchGestureRecognizer.view else { return } adjustAnchor(for: pinchGestureRecognizer) let scale = pinchGestureRecognizer.scale piece.transform = piece.transform.scaledBy(x: scale, y: scale) pinchGestureRecognizer.scale = 1 } @IBAction func panPiece(_ panGestureRecognizer: UIPanGestureRecognizer) { // 新增:仅捏合过程中才响应平移 guard isPinching, 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 }
拓展说明
如果你的需求实际是所有双指平移都响应,仅拦截单指平移,不需要和捏合手势绑定,那不需要新增isPinching变量,只需要在初始化平移手势的时候加一行配置即可:
panGestureRecognizer.minimumNumberOfTouches = 2
内容的提问来源于stack exchange,提问作者Curiosity
相关产品推荐
相关产品推荐

