1

次のアプリケーションをObjectiveCに実装する必要があります>> http://bit.ly/rHzVkF

アプリのようにドラッグして円を回転させるにはどうすればよいですか?同様の例をいくつか知っていますか?

4

3 に答える 3

1

タッチ開始メソッドでは、xとyをチェックして、2つの回転するタブの境界にあるかどうかを確認する必要があります。

タッチを動かすと、xとyの位置の変化(デルタ)を検出し、ATAN2(dx、dy)を使用する必要があります。革命のためにラジアンに変換すると思います。私が間違っている場合は、紙でそれを理解することができます、それは単純な三角法です(インポートすることを忘れないでください<Math.h>

この新しい回転変数を使用して、スピンするオブジェクトに適用しますCGAffineTransformRotate();(これはコアグラフィックスの一部であると思われるので、そのライブラリもインポートしていることを確認してください)。

于 2013-01-09T16:11:02.160 に答える
0

@ihkawissココアタッチで円を描く方法を知っていますか?– バイキングセグンド

@ihkawiss、あなたは私に答えたくないでしょう。問題なし。あなたのタスクは、より小さなタスクに分割する必要があります。

  1. 指定されたデフォルト位置 (ハンドル) に小さな円を描く
  2. 大きな円を描く
  3. タッチ座標を取得し、ハンドル内にある場合は次のポイントに進みます。
  4. 円の中心、タッチ位置、および固定点 (つまり、上部中心) の間の角度を計算します。
  5. 円の角度、固定点、および半径を使用して、ハンドルの新しい位置を計算します
  6. タッチがトリガーされる限り、すべてを再描画します。

ネットおよびスタック オーバーフローで、この各ステップについて十分な情報を取得できるはずです。行き詰まった場合 (これはごく普通のことであり、当然のことです)、戻ってきて、これまでの結果を示し、どこで行き詰まったかを説明してください。

于 2013-01-09T23:17:13.123 に答える
0

同様のシナリオを解決しなければならなかったので、これに 2 セントを投入しようとします。

すべての動きを処理したいビューに touches メソッドを実装する必要があります

  • (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)イベント
  • (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)イベント
  • (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)イベント

x と y の位置の変化を検出する必要があるとアルバートは書いています。メソッドのトリガー時にメソッドに送信される NSSet タッチから場所を取得できます。

メソッドでは、タッチ データを操作するために、このコードのいくつかのバリエーションを実装する必要があります。

for(UITouch *t in touches){
    if([t tapCount] > 1){
        return;
    }
    CGPoint loc = [t locationInView:self.view];

ユーザーがタッチした場所 (この場合は CGPoint loc) の x と y を取得したら、math.h ライブラリから atan2 メソッドを実行して、円のラジアンを取得できます。atan2() を使用するには、 #include < math.h > が必要です。

atan2() が機能するには、2 つの y ポイントと 2 つの x ポイントの差という 2 つの引数が必要です。私の場合、現在の (タッチ y ポイント、- 円の中心 y) と現在の (タッチ x ポイント、- 円の中心 x) を使用しました。

    double rads = atan2((loc.y - (self.frame.size.height/2)), (loc.x - (self.frame.size.width/2))); 

そこから、その情報を使ってさまざまなことを行うことができます。円の周りの新しい x と y の位置を計算するには、余弦関数と正弦関数を利用して適切な座標を計算する必要があります。

   newXposition = CenterX + cos(rads) * radiusOfCircle
   newYposition = CenterY + sin(rads) * radiusOfCircle

円の中心 X 位置を cos (前に取得したラジアンを入力) に円の半径を掛けた結果に追加することで、新しい xPosition を取得できます。新しい yposition は、同じことを行うだけで取得できます。代わりに sin() を使用します。

したがって、私のコードは次のようになりました....

    float radius = 61;
    float newXPos = 140 + (cos(rads) * radius);
    float newYPos = 165 + (sin(rads) * radius);

頑張ってください、これがあなたが始めるのに役立つことを願っています. このようなものはトリッキーな場合があります

于 2013-01-18T16:50:19.947 に答える