2

私はヴィンテージの電話を作っていて、ユーザーがUIImageViewの数字の上に指を動かしてダイヤルを回転させる作業開始コードを手に入れました。その後、元の位置に戻します。スクリーンショットを参照してください。

ここに画像の説明を入力

私が理解できないように見える3つの問題は次のとおりです。

  1. ユーザーが時計回りにのみ回転するように制限するにはどうすればよいですか? 現在、ユーザーは任意の方向に移動できます (時計回りと反時計回り)。

  2. ユーザーが選択した番号を検出するにはどうすればよいですか? ユーザーが1または3または5に触れたことを意味しますか? その数字が右側のバーに達したときにローテーションを停止できるように、この情報が必要です。

  3. 現在のコードでは、回転を止めて円を離すと、反時計回りに戻って元の場所に戻ります。1、2、3、4 を選択すると問題なく動作しますが、5 以上の数字を選択すると、ダイヤルは時計回りに元の位置に戻ります。touchesEndedで反時計回りの動きを強制するにはどうすればよいですか?

4

5 に答える 5

1

このジェスチャーについて話しているとしましょう。

ロータリーダイヤル ソース


ワンタッチ回転ジェスチャ認識エンジンを構築します。ジェスチャ レコグナイザを正しく構築した後は、回転を見て、回転パッドをどうするかを確認できます。

シングルタッチ回転ジェスチャ レコグナイザーを作成する際に考慮すべき点がいくつかあります。を見るとUIRotationGestureRecognizer、2 本の指で支えられた 2 つのタッチ間の接続を使用して現在の角度を取得し、その角度を以前のタッチ変更イベントから取得した前の角度と比較してデルタを確認します。

現在の角度の測定

線を形成するには 2 点が必要で、角度を知るには線が必要です。ワンタッチで作業している場合は、アンカー ポイントが必要です。アンカー ポイントをジェスチャ レコグナイザに送信する方法は多数ありますが、カスタム クラスを作成する可能性が高いため、委任を使用してください。

回転数の累積

角度をメモして、タッチの変更中にメッセージを送信するだけでうまくいく場合があります。ただし、ヒステリシスを実装したい場合 (たとえば、このロータリー ダイヤルは時計回りに 1 回だけ回転し、その後、締め付けられます)、時計回りと反時計回りの両方の回転数を累積する必要があります。

幸いなことに、a) タッチ イベントが頻繁にドロップされることはなく、b) 現在の角度と過去の角度を単純に比較して、象限の境界を越えているかどうかを確認するだけで十分であると想定できます。

例えば:

  • タッチが左上の象限から右上の象限に移動した場合、回転カウントに 1 を追加します。
  • タッチが右上の象限から左上の象限に移動した場合、回転数から 1 を引きます。

(うん、これは実際に動作します。)

正確な累積回転を放出する

回転情報をまったく同じように出力したい場合UIRotationGestureRecognizerは、追跡するものが 4 つあります。

  1. 開始角度:アンカー ポイントから開始タッチまでの接続と、アンカー ポイントから固定基準点までの接続の間の角度。
  2. 現在の角度:アンカー ポイントから現在のタッチへの接続と、アンカー ポイントから固定基準点への接続の間の角度。
  3. Rotation Count:現在の角度の現在の値を最後の値と継続的に比較することによって得られる時計回りの回転数 (前のセクションで説明したように)。タッチが反時計回りに移動している場合、このカウントは負になります。

Rotation Count * 2_PI + (Current Angle - Starting Angle)ローテーションとして提供します。

于 2012-12-22T08:56:05.033 に答える
0

より良いダイヤルは次のとおりです。

ここに画像の説明を入力

楽しむ!

于 2012-12-11T20:38:13.370 に答える
0

どの数字がタッチされたかを検出するには、各数字を作成するときtagにその UIView の値を設定する必要があります。次に、ユーザーが数字に触れると、そのタグの値を確認することで、それがどの UIView オブジェクトであったかを検出できます。

回転の問題については、角度の計算方法を確認することをお勧めします。推測では、4 より大きい数値 (タグから識別できます) については、現在計算している角度を 360 度 (まあ 2Pi) から減算する必要があります。(しかし、私は今、頭が冷えているので、実際の数学は私を逃れています:-) )

于 2012-12-09T19:21:25.873 に答える
0

わかりました、私は別のアプローチを取ります。まず、RotaryDialすべての動作をカプセル化するクラスを作成します。その後、必要に応じて任意のビューにプラグインできます。

物事を単純にするために、各数字ボタンを可動 UIImageView にするか、それを呼び出すRotaryDialDigitか、そのようなものにすることを検討します。それらを 10 個インスタンス化して配置します。

ダイヤルの「フレーム」は、ユーザーがボタンの 1 つを動かすと、乗車に合わせてタグ付けされRotaryDialDigitます。それは単なる画像です(ユーザーがそれに触れて何かをできるようにしたい場合を除きます.

そこから、どのボタンが押されているかを知り、その回転を特定の方向に制限し、バーで停止することはかなり簡単です.

プロトコルを使用することRotaryDialで、番号がダイヤルされたときにインスタンスからコンテナに通知することができます。コンテナRotaryDialにとっては、ボタンが押されるたびにメッセージを送信するキーパッドのように感じます。コンテナーが、完了した番号の選択以外に煩わされることは本当に望ましくありません。

于 2012-12-09T18:17:23.947 に答える
0

あなたのコードを見なくても、数字は静止画像であり、指の穴が各数字を通り過ぎて回転するときに指の穴をアニメーション化していると思います。もしそうなら:

どの番号を検出するか: 各ボタンの周りに CGRect を定義します。ユーザーが画面をタップしたときに、タップ位置がどの四角形に含まれているかを確認します。

回転方向の制御: ユーザーが指をドラッグすると、ダイヤル ストップから現在のタップ位置までの角度が継続的に計算されます。角度が間違った方向に移動する場合は、指穴の位置を更新しないでください。三角関数は +Pi から -Pi ラジアンまでの値を返すことに注意してください。5 より大きい数字の場合は、負の角度を処理するのではなく、角度に 2Pi ラジアン (または 360 度) を追加することをお勧めします。

間違った方向に回転: 5 未満の数字は、0 から -Pi の範囲の角度を生成しています。コードを見なくても、角度に 2Pi を追加すると回転方向が修正されるのではないかと思います。

于 2012-12-09T22:42:55.787 に答える