今度は指でドラッグして回せるようにしました。

 

 

PanGestureRecognizerで画面上の指の位置を受け取り、

それを回転軸からの位置に変換して、角度を割り出しました。

 

回転するビューは、見た目は丸いですが、実体は四角なので、

そのままでは見えない角を触っても回ってしまいます。

そこで、回転するビューの point(inside: with:) -> Bool をオーバーライドして、

丸の外側ならfalseを返すようにしています。

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
  let x = Float(point.x - midPoint.x)
  let y = Float(point.y - midPoint.y)
  let distance = CGFloat( sqrtf(x*x + y*y) ) // 中心からの距離
  guard distance <= midPoint.x else {
    return false // 丸の外側ならイベントを無視
  }
  return true
}

 

 

丸の内側からドラッグした場合は、丸からはみ出しても回転を続け、

逆に丸の外側からドラッグした場合は、丸に触れても回転しません。

この動作が自然かどうかはアプリのコンセプトによりますが、

ここでは、指が丸に触れている時だけ回転するようにしたいです。

 

内から外の場合は、ドラッグ中も point(inside: with:) -> Bool で判定を繰り返せばいいと思いますが、

外から内の場合は、どのようにするのか見当がつきませんショボーン

そのような働きのNotificationか何かがあるのでしょうか…。

 

 

ちょっとお昼寝しますzzz 羊