2017-07-14 8 views
-1

私はiOSアプリケーションに取り組んでいます。ホイールを作成する必要があります。このホイールでは、アプリケーションがサーバーからホイールイメージを取得し、ユーザーはボタンを押して回転させます。
入力はホイールイメージと特定の角度です。私はその角度でホイールを停止する必要があります!
それに加えて、車輪は回転しながら速度を持っている必要があります。
アイデアや解決策がある場合は、私に知らせてください。
ありがとうございました!このビューを作成するios - ホイールの特定の角度で停止する

+0

これまでに何を試してみましたか、正確に何が問題になっていますか? –

+0

あなたのコードを質問に追加して、あなたがどこにいるのか正確に説明してください。 –

+0

私はこのリンクを助けると思う=> https://www.cocoacontrols.com/controls/jswheelview – Jay

答えて

0

は(UIViewのプロパティである)は、クリップサブビュー正方形UIViewを有することが最も簡単であり、コーナー半径(層view.layer.cornerRadiusのプロパティ)は半画幅(または高さ)に設定されています。このビューでは、画像が表示された画像ビューを追加します。

ビューを回転するには、単にview.transform = CGAffineTransform(rotationAngle: angleInRadians)のような変換を使用します。このプロパティはアニメーション可能なので、UIView.animate...メソッドを使用して回転をアニメートできます。この場合、アニメーションブロック内の変換をターゲット角度に設定するだけで、ビューが正しく回転してアニメーション化されます。また、カーブが緩やかに始まり、ゆっくりとホイールをスタートさせ、加速した後、減速して停止するオプションを追加することもできます。

あなたの車輪がある角度で停止する前にいくつかの円を描いている場合は、UIViewのアニメーションは少し不適切かもしれません。その場合、私は1.0/60.0の間隔で繰り返しタイマーを作成し、60FPSをトリガーします。あなたの車が起動すると、あなたは、開始日を救う:

startDate = Date() 

と終了日:また、開始角度を保存する必要が

endDate = startDate.addingTimeInterval(expectedDuration) 

startAngle = currentAngle 

と終了角のように:

endAngle = CGFloat(Int(currentAngle/(CGFloat.pi*2))*(CGFloat.pi*2)) + // This will roughly return how many circles have currently pass 
      CGFloat.pi*(numberOfFullCircles*2) + // Add full circles 
      angleToStopAtInRadians // Add the destination angle 

いつでもビューの変換をターゲット回転に更新する必要があります。それは、(例えばイーズアウト)

currentAngle = startAngle + (endAngle-startAngle)*scale // Use this in the rotation matrix 

非線形を使用するには:

let absoluteScale = endDate.timeIntervalSince(Date())/endDate.timeIntervalSince(startDate) 
let scale = CGFloat(max(0.0, min(absoluteScale, 1.0))) 

その後、我々は、線形補間を使用する必要があります:あなたは、アニメーションで使用すると、現在、現在の時刻に応じている場所を見つける必要がありますスケールを変更するのが最善です。簡単にするために、たとえばscale = pow(scale, 1.0/1.3)を使用します。もっと興味深いアルゴリズムを見つけたり作成したりして、これらの値を使いこなすことができます。

最後に、absoluteScaleif absoluteScale >= 1.0ですでに書き込まれているアニメーションが終了したら、タイマーを停止してから、アニメーションが完了し、タイマーを無効にして、その後に実行する必要があるものをトリガーする必要があります。

これを楽しんでください。困ったときは、新しい質問をいくつかの詳細とコードとともに投稿してください。

関連する問題