0

現在、XCode で UISlider を制御しているところに行き詰まっています。Interface Builder で水平スライダーを作成し、コントロールを xcode でコーディングしました。今のところ、ロジックをコーディングする方法がわかりません。ユーザーがペン先を左にスライドすると、画像が反時計回りに回転し、右にスライドすると画像が時計回りに回転します。

設定したスライダーの最小値は 0 で、最大値は 100 です。初期値は 50 です。

変換には CGAffineTransformMakeRotation(myAngle) を使用しています。myAngle を float に設定しました。条件については、コードのスニペットを次に示します。

mySlider.value = myAngle; // This is for CGAffine

if(myAngle < 50) {
   myAngle -= 0.1;
}

if(myAngle > 50) {
   myAngle += 0.1;
}

ペン先をスライドさせると、反時計回りにしか回転しません。使用できる最適なロジックは何ですか? 誰かが助けてくれることを願っています。ありがとう。

-ハキモ

4

2 に答える 2

0

Docangleがasについて述べていることに注意してください。

この行列が座標系の軸を回転させる角度 (ラジアン単位)。iOS では、正の値は反時計回りの回転を指定し、負の値は時計回りの回転を指定します。Mac OS X では、正の値は時計回りの回転を指定し、負の値は反時計回りの回転を指定します。

次のようなものが機能するはずだと思います。よくわかりませんが。(minimumValue が 0 であることを考慮して)。

float middleValue = slider.maximumValue / 2;
float value = middleValue - slider.value;
float degrees = (middleValue / 180) * value;
float radians = degrees * (3.14/180);
于 2011-07-01T10:31:49.837 に答える
0

スライダーの固定位置を回転の固定角度に対応させたい場合は、次のようにすることができます。

float degreesToRadians = M_PI / 180.0;
CGFloat angle = (mySlider.value - 50) * degreesToRadians;
myView.transform = CGAffineTransformMakeRotation(angle);

一方、スライダーがドラッグされている場合を除いて中央にスナップし、ドラッグされた距離がビューの回転速度を決定するなど、より複雑な動作が必要な場合は、タイマーを使用することをお勧めします。特定のセレクターを呼び出すように を設定し、NSTimerそのセレクターで次のようにします。

- (void)timerFired:(NSTimer *)aTimer {
  CGFloat angleDelta = (mySlider.value - 50) / 500;
  // I'll assume myAngle is an instance variable.
  myAngle += angleDelta;
  myView.transform = CGAffineTransformMakeRotation(myAngle);
}

また、ユーザーがドラッグを停止したときに設定するメソッドを別の場所に記述する必要があります。これは、スライダーにand ...mySlider.value = 50のターゲット/アクションを追加することで実行できます。UIControlEventTouchUpInsideOutside

UIView必要に応じて、変換を設定するたびにアニメーションを使用し、NSTimer間隔に等しいアニメーション時間を使用して、回転を非常に滑らかに見せることができます。そうすれば、タイマー メソッドの代わりにアニメーション コールバックを使用して、2 つのイベント間のクロスオーバーを回避することをお勧めします。

于 2011-07-01T10:37:54.267 に答える