はじめに
標準のUIPinchGestureRecognizerだと得られるScaleはタッチした2点の距離をベースに計算されます。そのため、縦に伸ばしたか横に伸ばしたかは結果に反映されません。
縦横それぞれでScaleが欲しかったため、UIPinchGestureRecognizerを拡張してTwoDimentionsPinchGestureRecognizerというクラスを作成しました。
実装と解説
実際のコード
class TwoDimentionsPinchGestureRecognizer : UIPinchGestureRecognizer {
private var initPinchWidth : Float = 0
private var initPinchHeight : Float = 0
private var _scaleX : Float = 0
private var _scaleY : Float = 0
var scaleX : Float {
get { return _scaleX }
}
var scaleY : Float {
get { return _scaleY }
}
override func touchesBegan(_ touches: Set, with event: UIEvent) {
super.touchesBegan(touches, with: event)
guard touches.count == 2 else { return }
let locations = touches.compactMap { touch in
return touch.location(in: self.view)
}
initPinchWidth = Float(abs(locations[0].x - locations[1].x))
initPinchHeight = Float(abs(locations[0].y - locations[1].y))
}
override func touchesMoved(_ touches: Set, with event: UIEvent) {
super.touchesMoved(touches, with: event)
guard touches.count == 2 else { return }
let locations = touches.compactMap { touch in
return touch.location(in: self.view)
}
let newPinchWidth = Float(abs(locations[0].x - locations[1].x))
let newPinchHeight = Float(abs(locations[0].y - locations[1].y))
_scaleX = newPinchWidth / initPinchWidth
_scaleY = newPinchHeight / initPinchHeight
}
}
解説
尚、touchesBeganとtouchesMovedで取得されるtouchesはSetのため順番が保証されていません。より完成度を求めるならばcompactMapで得られた結果をソートする必要があります。

0 件のコメント:
コメントを投稿