次は指で回した速さで回転を続けるようにしました![]()
ドラッグの勢いを示すVelocityを利用しました。
Velocityは、1秒間あたり何point移動する勢いに相当するか、という値です。
この値と、指の位置の円周長から、回転速度を割り出しています。
具体的には、半回転するのにかかる秒数、としました。
ところが、それをそのままUIViewアニメーションにすると、
新しい回転速度が、半回転ごとにしか適用されません。
なぜなら、アニメーションを中断する方法がわからないからです![]()
そこで45度ずつの回転にして、ごまかしました。
アニメーションを中断できれば、もっと操作感が良くなると思うのですが…。
もうひとつ厄介だったのは、回転方向の判定です。
通常の範囲であれば、前回の角度と新しい角度の大小を単純に比較すれば、
回転方向がわかりますが、プラスπとマイナスπの境界では矛盾が生じます![]()
そこで、前回の角度と新しい角度の差はπ以上に広がらないはずだ、
という前提で回転方向を判定しました。
if delta < CGFloat.pi {
if delta > -CGFloat.pi { // 通常の範囲内にある場合
previousAngle = currentAngle
if delta > 0 {
isClockwise = true // 時計回り
} else {
isClockwise = false // 反時計回り
}
} else { // 時計回りに境界を越えた場合
previousAngle -= 2 * CGFloat.pi
isClockwise = true
} else { // 反時計回りに境界を越えた場合
previousAngle += 2 * CGFloat.pi
isClockwise = false
}
ややこしかったです![]()
