0

ドラッグしてスワイプできるタイルアプリケーションを構築しています。現在、タイルのブロック全体がサブビューとして追加されています。タイル要素をドラッグするより良い方法は何か、別の要素の上に配置すると、要素の位置座標がスワップされることに興味がありました。

Swaps when placent A to B
View A <- -> View B 

To 

View B <- -> View A

私はタッチイベントを調べましたが、それは任意のビューに基づいています。また、私はUIGestureRecognizerを調べましたが、それを処理できる優れたフレームワークがあるかどうか、またはそれよりも優れた方法があるかどうか疑問に思っていました.

4

2 に答える 2

0

スーパー ビューでタッチ イベントをオーバーライドすることで、このシステムを非常に簡単に作成できます。タッチが始まると、どのサブビューがヒットしたかがわかり、タッチが移動すると、その中心がタッチ位置に移動し、タッチが終了すると、ドロップされたビューを再度確認し、それらの 2 つのビューを交換します。

そのためにUIView役立つ便利なメソッドがたくさんありpointInsideます。あなたの目的のためだけに必要かもしれません。convertPointconvertRectpointInside

したがって、この場合、タイルを設定userInteractionEnabledNO、スーパービューでタッチを処理する必要があります。ヒット チェックを行うには、forループを使用しますpointInsideが、タッチが終了したら、現在ドラッグされているビューのチェックをスキップする必要があります。

編集: UIPanGestureRecognizer のコメント

UIPanGestureRecognizer実際に機能する可能性がありますが、メリットはほとんどありません。パンしているビューをすぐに取得できますが、それだけです。forループのようなものを介して、それが終わったビューを見つける必要があります。ジェスチャの位置は、スーパービュー座標に変換する必要があります (そうでない場合は、ビュー自体を移動するため、常に同じ座標を受け取ることになります)。欠点は、パンのイベントをすぐに取得できないことです。パンの開始を受け取るには、ビューを数ピクセルドラッグし始める必要があります。一方で、ビューをすぐに少し前面に移動するか、いくつかの操作を行う必要があります。このビューが移動可能であることをユーザーに通知する他のアニメーション。

とにかく、UIPanGestureRecognizer はパンを目的としており、そのように設計されています。目的に合わせて使用​​することは可能かもしれませんが、単純なタッチ イベントよりも多くの作業を行う必要があることに気付くかもしれません。

于 2013-06-12T06:48:22.220 に答える
0

メッセージは[touches anyObject]あなたにとって良い選択肢かもしれません

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
   [self methodToChangeView]; 
}

次の方法で

- (void)methodToChangeView {
     MyNewViewController *myNewViewController = [[MyNewViewController alloc] initWithNibName:@"MyNewViewController" bundle:nil];
    [self.navigationController pushViewController:myNewViewController animated:YES];
}
于 2013-06-12T06:48:31.160 に答える