Categories: Swift

UIViewをピンチイン・ピンチアウトで拡大縮小

環境:Swift5

二本指で拡大・縮小ができるUIView

コード全文

ストーリーボードは利用していませんのでコピペだけでテストが可能です

import UIKit

class ViewController: UIViewController {
    
    let pinchView = UIView()
    var prevPinch:CGFloat = 1

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        self.pinchView.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
        self.pinchView.backgroundColor = .red
        self.pinchView.center = self.view.center
        self.view.addSubview(self.pinchView)
        
        let pinchGesture = UIPinchGestureRecognizer()
        pinchGesture.addTarget(self, action: #selector(pinchAction(_:) ) )
        
        self.pinchView.addGestureRecognizer(pinchGesture)
    }
    
    // Pinch
    @objc func pinchAction(_ gesture: UIPinchGestureRecognizer ){
        ////前回の拡大縮小も含めて初期値からの拡大縮小比率を計算
        let rate = gesture.scale - 1 + prevPinch
        //拡大縮小の反映
        self.pinchView.transform = CGAffineTransform(scaleX: rate , y: rate )
        
        if(gesture.state == .ended) {
            //終了時に拡大・縮小率を保存しておいて次回に使いまわす
            prevPinch = rate
        }
        
    }


}

拡大縮小時に注意することは

前回の拡大・縮小率の保存を行うことでしょうか?

これがないと次回の拡大縮小時に元の倍率から開始され、不自然な動作になります

UIViewに関わらず全てのViewで言えることですが、ユーザーの操作に合わせて何かを行う際にはGestureが必要になってくるので基礎を抑えておけば色々と応用できるので基礎的な事をできるようにしておきましょう

Pype