【发布时间】:2021-12-23 22:01:57
【问题描述】:
我有以下代码来同时识别平移、捏合和旋转手势识别器。问题是旋转视图时平移手势无法正常工作。在水平拖动旋转视图时,它也会不断向上移动。这是我的代码。
import UIKit
class ViewController: UIViewController, UIGestureRecognizerDelegate {
private var transformEditingView:UIView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.view.backgroundColor = UIColor.blue
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(transformViewGestureHandler(_:)))
panGesture.delegate = self
panGesture.maximumNumberOfTouches = 1
self.view.addGestureRecognizer(panGesture)
let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(transformViewGestureHandler(_:)))
pinchGesture.delegate = self
self.view.addGestureRecognizer(pinchGesture)
let rotationGesture = UIRotationGestureRecognizer(target: self, action: #selector(transformViewGestureHandler(_:)))
rotationGesture.delegate = self
self.view.addGestureRecognizer(rotationGesture)
transformEditingView = UIView(frame: self.view.bounds.insetBy(dx: 100, dy: 100))
transformEditingView?.backgroundColor = UIColor.clear
self.view.addSubview(transformEditingView!)
transformEditingView?.layer.cornerRadius = 4.0
transformEditingView?.layer.borderWidth = 4.0
transformEditingView?.layer.borderColor = UIColor.red.cgColor
}
// MARK: - Gestures for tansformEditingView
func transformUsingRecognizer(_ recognizer: UIGestureRecognizer, transform: CGAffineTransform) -> CGAffineTransform {
if let rotateRecognizer = recognizer as? UIRotationGestureRecognizer {
return transform.rotated(by: rotateRecognizer.rotation)
}
if let pinchRecognizer = recognizer as? UIPinchGestureRecognizer {
let scale = pinchRecognizer.scale
return transform.scaledBy(x: scale, y: scale)
}
if let panRecognizer = recognizer as? UIPanGestureRecognizer {
let deltaX = panRecognizer.translation(in: self.view).x
let deltaY = panRecognizer.translation(in: self.view).y
return transform.translatedBy(x: deltaX, y: deltaY)
}
return transform
}
var initialTransform: CGAffineTransform?
var gestures = Set<UIGestureRecognizer>(minimumCapacity: 3)
@IBAction func transformViewGestureHandler(_ gesture: UIGestureRecognizer) {
switch gesture.state {
case .began:
if gestures.count == 0 {
initialTransform = transformEditingView.transform
}
gestures.insert(gesture)
case .changed:
if var initialTransform = initialTransform {
gestures.forEach({ (gesture) in
initialTransform = transformUsingRecognizer(gesture, transform: initialTransform)
})
transformEditingView.transform = initialTransform
}
case .ended:
gestures.remove(gesture)
default:
break
}
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}
编辑:我发现以下更改解决了问题,但不确定原因。
let deltaX = panRecognizer.translation(in: transformEditingView).x
let deltaY = panRecognizer.translation(in: transformEditingView).y
【问题讨论】:
-
快速搜索遇到了这个要点:gist.github.com/sketchytech/27e46e3f6abc083ee9749835e34cb125 ... 似乎在平移/捏合/旋转方面做得很好。
-
@DonMag 我怀疑您发布的要点是否适用于同时识别捏合和旋转手势。对于同时识别,您需要将触发的手势存储在一个数组中并按照我的代码中发布的顺序处理它们。
标签: ios swift uiview uikit uigesturerecognizer