0

現在のオブジェクトをでタッチしたいtouchesMoved。これをtouchLocation(CGPoint)と混同しないでください。ただし、ユーザーが実際に触れているオブジェクトと混同しないでください。を使用UITouchすると、現在または最新のタッチではなく、常に最初のタッチが返されます(アップルのドキュメントに記載されています)。

3x3から20x20までのスポット(UIImageViews)のグリッドがあります。

ユーザーが画面上で指をドラッグすると、ユーザーの指を追跡する線が描画されます。ユーザーがグリッドスポットと交差すると、線の始点がそのスポットにスナップし、指を追跡し続けます。基本的に、グリッド上に形状を描画できます。

現在、タッチロケーションがグリッドスポットと交差するかどうかをチェックするforループがあります。これは機能しますが、400グリッドスポットの場合は明らかな理由で非常に遅くなります。

ジェスチャレコグナイザーも試しましたが、これらはタッチをキャンセルします。

どんな助け/アドバイスも大歓迎です、ありがとう!

編集:これは私が私のtouchsMovedに持っているものです。

UITouch* touch = [touches anyObject];
CGPoint touchLocation =[touch locationInView:self];

for (int i=100; i<tagInt; i++) {

    UIImageView *img=(UIImageView*)[self.view viewWithTag:i];

    if (CGRectContainsPoint(img.frame, touchLocation)) {
       //Drawing code  setNeedsDisplay etc
    }
 }
4

2 に答える 2

0

最初の質問へのコメントで説明したように、コンテナ ビューからタッチ位置を見つけるのが最善のようです。このコードの最大のボトルネックは、すべてのオブジェクトを 1 つの線形配列に格納してから、配列内の各要素をチェックすることです。より良い方法は、位置に基づいて個々のオブジェクトにアクセスできる、より適切な形式でオブジェクトを格納することです。

オブジェクトが厳密なグリッド上に配置されている場合、それらを 2 次元配列に格納するだけで十分高速です。画面をグリッド分割に分割し、それらのグリッド分割内で touchesMoved ポイントを見つけます。これら 2 つの整数を 2D 配列のインデックスとして使用し、配列内のその場所で使用可能な 1 つのオブジェクトを確認します。グリッドのすべての位置にオブジェクトがない場合は、その場所に nil を格納して、コードに「ここをチェックする必要はありません」と伝えます。各グリッド位置に複数のオブジェクトがある場合は、配列内のその位置にあるオブジェクトのリストを保持し、リスト内のすべてのオブジェクトを確認できます。これは合計よりもはるかに少なくなります (オブジェクトがまとまらない場合)。

オブジェクトが厳密なグリッドに配置されていない場合でも、この手法を使用できます。画面を 4 つの象限に分割するだけで、オブジェクトのチェックに必要な時間が最初の約 4 分の 1 に短縮されます。

オブジェクトが移動している場合は、この配列を最新の状態に保つ必要があります。

この 2D 配列は、質問の限られた情報に基づいて、これを行うためのより良い方法について最初に考えたものです。これは、実際のプログラムで作業するのに最適な方法ではない可能性があり、別のデータ構造とアルゴリズムが適している場合があります。

于 2012-10-29T13:38:13.610 に答える
0

タッチ処理メソッドに描画コードを入れないでください。おそらく最善の方法は、すべてのタッチ ポイントを一時的な変更可能な配列に保存することです。メソッドでは、drawRectフレームごとに 1 回、正しい線を描画します。タッチ処理メソッドからロジックを取り出します。(バックグラウンドで位置固定計算を行うこともできます。行は、完了後に更新されます..)

何を描こうとしているのか、いまだによくわかりません。画像の例を教えてください。

于 2012-10-29T16:05:18.900 に答える