📘
UIGestureRecognizerのピンチイン/アウトで拡大縮小する際の最大値と最小値を設定する
はじめに
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