📘

UIGestureRecognizerのピンチイン/アウトで拡大縮小する際の最大値と最小値を設定する

2021/01/28に公開

はじめに

UIScrollViewを使用してUIImageViewをピンチで拡大縮小する実装は簡単に実現できるが、UIScrollViewを使用せずに、UIImageViewにUIGestureRecognizerをセットして拡大縮小する際の最大/最小を定義する方法がなかなか実現できなかったので、メモを残しておきます。

実装

UIPinchGestureRecognizerをインスタンス化する処理や、UIImageViewにaddGestureRecognizer()するコードは割愛します。
下記はUIGestureRecognizerのaction部分のみのコードです。

     @objc func pinch(_ sender: UIPinchGestureRecognizer) {
            guard let gestureView = sender.view else { return }
	    
            if sender.state == .began {
                  lastScale = sender.scale //lastScale はメンバ変数として定義する。
                }
		
            if sender.state == .began || sender.state == .changed {
                  let currentScale: CGFloat = gestureView.layer.value(forKeyPath: “transform.scale”) as! CGFloat
                  let maxScale: CGFloat = 3.0 // 最大値を定義
                  let minScale: CGFloat = 1.0 // 最小値を定義
                  var newScale: CGFloat = 1 - (lastScale! - sender.scale)
                  newScale = min(newScale, maxScale / currentScale)
                  newScale = max(newScale, minScale / currentScale)
                  gestureView.transform = (gestureView.transform.scaledBy(x: newScale, y: newScale))
                  lastScale = sender.scale
                }
          }

Discussion