2011-12-03 6 views
7

UITableViewの上にUIViewというサブクラスがあります。私はUITableViewを使ってデータを表示していますが、同時に、指に続くアニメーションをオーバーレイしたいと思います(例えば、トレイルを残すなど)。複数のビューで処理されるタッチイベント

私が正しく理解したら、UIViewサブクラスとUITableViewの両方で処理するタッチイベントが必要です。どうやってやるの? UIViewサブクラスでtouchesMovedがトリガーされていても、次にUITableViewでトリガーされている可能性はありますか?

ありがとうございました。

答えて

10

私がこの問題を解決した方法は、きれいではない方法でありますが、それは機能します。これを行うより良い方法があれば教えてください。

私はUIViewのカスタムのためにhitTestをオーバーライドして、その下のUITableViewにタッチします。その後、UITableViewで私はtouchesBegantouchesMovedなどのジェスチャーを処理しています。私はまたUIViewtouchesBeganと呼んでいます。

このように、タッチは2つのビューで処理されます。 逆のことをしていない理由(UIViewtouchesBeganUITableViewtouchesBeganと呼ぶ)は、UITableViewのジェスチャ認識機能が動作しないためです。

UIViewサブクラスお返事のためのhitTest

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    // tview is the UITableView subclass instance 
    CGPoint tViewHit = [tView convertPoint:point fromView:self];   
    if ([tView pointInside:tViewHit withEvent:event]) return tView; 

    return [super hitTest:point withEvent:event]; 
} 

UITableViewサブクラスのtouchesBegan

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView:touch.view]; 
    // .... 

    // view is the UIView's subclass instance 
    [view touchesBegan:touches withEvent:event]; 
} 
+0

非常にクールな。私はしばらくして後に何か似て探していた。投稿していただきありがとうございます。 – riship89

+0

私はこれが本当に好きです。サブビューのTouchesBeganなどを手動で呼び出すことで、間違った方法でやっていました。このメソッドは素晴らしい動作します! – Gandalf458

0

UITableViewは未処理のタッチイベントをUIViewにリレーします。 (Googleのレスポンダーチェーン) UITableView Documentation

したがって、UIViewでのみタッチイベントを処理できます。そう。あなたのUIViewで

  1. touchesstart - 初期のものを行う

  2. touchesmove -

  3. touchesendを(それが道のようになりますようにdesableポイントに使用タイマー/ delayedresponse)をUIViewの上で尾を引きます - 残りのものを行う

+0

おかげで私は、私は完全には理解していないです(特に私は、最初の文の意味を理解していません) 。私はUIViewでトレールを描くことができることを知っているが、私はまだUITableViewにタッチイベントを渡す必要があるだろう(スクロール、選択など)。私が誤解した場合は申し訳ありません。 –

+0

Objective-Cには、レスポンダーチェーンと呼ばれるものがあります。あるクラスが特定のイベントを処理しない場合、そのクラスはSuperクラスで処理する必要があります。そのイベントを処理するクラスがない場合、最終的にそのイベントはNSObjectによって処理されます。したがって、UIViewはUITableViewのスーパークラスであるため、UIViewからUITableViewイベントに応答できます。 – riship89

+0

私は特にObjective-Cの専門家ではないとお詫び申し上げます...これが事件にどのように当てはまるかの例を挙げてください。私はジェスチャーのUITableViewハンドルを持って、それらをスーパークラスに渡すべきですか?どうやって? –

1

いいえ、あなたはそれを暗にすることはできません。 Event Delivery章では、ウィンドウオブジェクトは、タッチイベントを受信するための ビューを見つけるために、ヒットテストおよびレスポンダチェーンを使用しています

を言います。ヒットテストでは、ビュー階層の一番上のビューに hitTest:withEvent:を呼び出します。この メソッドは、 ビュー内の各 ビューでpointInside:withEvent:を再帰的に呼び出して、YESを返します。 の境界内のサブビューを見つけるまで、 階層を続けます。そのビューはヒットテストビューになります。

したがって、ウィンドウがタッチされたビューを見つけると、それはYESを返します。現在の瞬間には、1つのビューしかタッチを処理できません。

しかし、UITableViewのイベントを処理する必要がある場合は、UIViewのためにそれを処理してください! – convertPoint– convertRect関数でタッチポイントを必要な座標に変換し、UITableViewにサブビューを追加して、それを座標に依存して移動させることができます。

+0

これは間違いなく機能します。私はUIViewサブクラスの下に複数の要素があるかもしれません...これらの要素すべてのプロセスを繰り返す必要がありますか?また、グローバル座標を取得するために座標を変換する必要がありますか?ありがとうございました。 –

+0

私はあなたが示唆したようにしましたが、私はもはやUITableViewをスクロールできません。なぜなのかご存知ですか?ありがとうございます –

関連する問題