次は指で回した速さで回転を続けるようにしましたニコニコ

 

 

ドラッグの勢いを示す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
}

ややこしかったですゲッソリ