1

UIView使用してアニメーション化するインスタンスがありますCAKeyframeAnimation。これはループ アニメーションであり、常に動き続けます。ただし、ユーザーがアイテムを操作できるようにする必要があります (正確には、タップに応答します)。CoreAnimation はモデルではなくプレゼンテーション レイヤーのみを移動するため、UIButtonたとえばインスタンスを使用して本質的にtouchUpInsideイベントを取得することはできません。

次の基本的なレイアウト例を検討してください。

ここに画像の説明を入力

サブクラスのtouchesEnded:withEvent:メソッドをオーバーライドして、タッチ イベントに青いボックスを使用しています。次に、そのイベントを(このイベントを処理するために多くのカップリングを導入したくありません) を介して、含まれているビュー コントローラーにUIViewバブリングします。これにより、赤いボックスがアニメーション化されます。NSNotificationhitTest:

これはすべて、アニメーション化されUIViewた . アニメーション/インスタンスのタッチを処理するための最良のパターンは何ですか?UIViewCALayer

4

2 に答える 2

1

スーパービューでタッチを追跡することは正しいと思います。ただし、ビュー コントローラーに通知を投稿するのではなく、スーパービューでヒット テストを行います。このようなもの:

クラスを作成しますMYAnimationContainerView(青いボックス)。

所有するビュー コントローラーが設定するデリゲートまたはブロック コールバックを指定します。例えば:

__weak id weakSelf = self;
MYAnimationContainerView *view = [[MYAnimationContainerView alloc] initWithTouchCallback:^(UIView *touchedView){
  [weakSelf handleTouchToView:touchedView];
}];

では、 と の両方をMYAnimationContainerViewオーバーライドします。で、移動するビューのプレゼンテーション レイヤーでヒット テストを実行します。タッチされたもの (ある場合) を追跡します。で、別のヒット テストを実行します。同じビューの場合は、コールバックを呼び出します。touchesBegan:withEvent:touchesEnded:withEvent:beganended

上記はdelegate、ブロックではなくプロトコルを使用して簡単に実装できます。私は、1 つのメソッドのデリゲート プロトコルよりもブロックを優先する習慣を身につけてきました。

ターゲット/セレクターを使用して実装することもできますが、そのパターンはARC で少し面倒になり、今日はその使用を思いとどまらせる傾向があります.

于 2012-02-16T15:15:14.517 に答える
0

ビュー内の特定のオブジェクトのタッチを処理したい場合は、青色の赤いボックスと言ってください。UIview のサブクラスなど、別のクラスを作成し、その中でタッチ イベントを処理することをお勧めします。すっきりと抽象的です。

このようなオブジェクトが多数ある場合、タッチ イベントは単独で処理されます。

これがあなたが期待したものかどうかわかりません。

于 2012-02-16T05:52:34.547 に答える