Viewの中心座標からサイズ変更を行う場合CGAffineTransformを使うのが良い!

はじめに

UIViewのサイズを変更した時起点となる座標は左側になっています。これはanchorpointを変更しても変わりません。

frameでのサイズ変更を行う場合左上のpositionも同じように変更を行わない場合UIViewが右下に向かって拡大していきます。

Frameを変更する拡大縮小

UIViewのサイズを変更する時左上を固定としてサイズが変更されます。
例えば以下のようなコードでviewのサイズを変更した時動画のような挙動になってしまいます。

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        let pos = touches.first!.location(in: self.view)
                v.frame.size = CGSize(width: CGFloat(pos.x), height: CGFloat(pos.x))
    }


これはframeが固定値なってしまっているのが問題なので中心を維持しながら拡大させるためにはframeも動かさないといけません。

CGAffineTransformを変更する拡大縮小

CGAffineTransformを使って大きさを変更する方法です。

この方法であればframeのpositionは気にせずに拡大縮小を行うことができます。

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        let pos = touches.first!.location(in: self.view)

        let transScale = CGAffineTransform(scaleX: CGFloat(pos.x)/100, y: CGFloat(pos.x)/100)
        v.transform = transScale
    }