You have some problems in your code. First you need to add the UIGestureRecognizerDelegate to your view controller and make it a gesture recognizer delegate. and add the shouldRecognizeSimually method and return true. Secondly, when applying scale, you need to save the transformation when the pinch starts, and apply the scale at the top:
class DraggableImageView: UIImageView { override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { backgroundColor = .blue } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { backgroundColor = .green } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { if let position = touches.first?.location(in: superview){ center = position } } }
class ViewController: UIViewController, UIGestureRecognizerDelegate { var identity = CGAffineTransform.identity override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white setupViews() let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(scale)) let rotationGesture = UIRotationGestureRecognizer(target: self, action: #selector(rotate)) pinchGesture.delegate = self rotationGesture.delegate = self view.addGestureRecognizer(pinchGesture) view.addGestureRecognizer(rotationGesture) } let firstImageView: DraggableImageView = { let iv = DraggableImageView() iv.backgroundColor = .red iv.isUserInteractionEnabled = true return iv }() func setupViews() { view.addSubview(firstImageView) let firstImageWidth: CGFloat = 50 let firstImageHeight: CGFloat = 50 firstImageView.frame = CGRect(x: view.frame.midX - firstImageWidth / 2, y: view.frame.midY - firstImageWidth / 2, width: firstImageWidth, height: firstImageHeight) } @objc func scale(_ gesture: UIPinchGestureRecognizer) { switch gesture.state { case .began: identity = firstImageView.transform case .changed,.ended: firstImageView.transform = identity.scaledBy(x: gesture.scale, y: gesture.scale) case .cancelled: break default: break } } @objc func rotate(_ gesture: UIRotationGestureRecognizer) { firstImageView.transform = firstImageView.transform.rotated(by: gesture.rotation) } func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { return true } }
source share