2012-01-18 20 views
22

UIView私はUITapGestureRecognizerを追加しました。このビューの中には、基本的にはUITableViewのサブビューがあります。問題は、UITableViewが行のタップを認識しないのはなぜですか、その代わりにタップジェスチャ認識プログラムのハンドラに常に移動することです。これはなぜですか、これをどのように解決しますか?タップ数を2に設定すると、正常に動作します。どのようにこれを解決するための任意のアイデアですか?基本的にはdidSelectRowAtIndexPathは呼び出しません。UIViewとUITableViewのUITapGestureRecognizerが矛盾しています

答えて

54

認識者のcancelsTouchesInViewNOに設定してください。さもなければ、それはそれ自身のために接触を「消費」し、それをテーブルビューに渡さない。そのため、選択イベントは発生しません。あなたがしたい場合

+4

[この値を「いいえ」に設定すると、シーケンスが認識されたときでも、すべてのタッチを基になるビューに配信するように認識装置に指示します。](http://developer.apple.com/library/IOs/#documentation/ UIKit/Reference/UIGestureRecognizer_Class/Reference/Reference.html) – dasblinkenlight

+1

サンプルコード 'longPressGestureRecognizer.cancelsTouchesInView = NO;' (ありがとうdasblinkenlight) – tmr

+0

@dasblinkenlightはまだ私のために働いていない、私は私のテーブルビューのセル上でタッチイベントを実行することができない、私はテーブルビューのセルから項目を選択することができない、テーブルビュー:UITableView、didSelectRowAt indexPath:IndexPath) 'アイテムが選択されていません –

26

両方があなたUITableViewとあなたのUITapGestureRecognizerがタッチイベントを受信するために、[はいcancelsTouchesInView = NOが動作します。タップジェスチャ認識器がテーブルビュー用のタッチイベントを受け取らないようにするには、それはやや容易ではなく非常に能力があります。

ジェスチャ認識機能を作成するときは、自分をそのデリゲートとして設定します。次に、gestureRecognizer:shouldReceiveTouch:デリゲートメソッドを実装します。基本的な実装は次のようになります。このタッチの位置がtableViewの管轄内であれば基本的に

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ 
    UITableView *tableView = self.tableView; 
    CGPoint touchPoint = [touch locationInView:tableView]; 
    return ![tableView hitTest:touchPoint withEvent:nil]; 
} 

(実装される)この方法はtableView要求し、それがない場合は、tableViewを許容...タッチを受けるからジェスチャ認識をブロックしますタッチを受ける。

+1

3行目と4行目を以下のように変更することでこれをもっと簡単にできませんでした:' CGRect frame = self.tableView.frame; CGRectContainsPoint(フレーム、位置); '? – Aufwind

+0

@Aufwindあまりにも複雑な計算コードを指摘してくれてありがとう。私はこの答えをあまりにも急ぐ必要があります。 'CGRectContainsPoint()'は当然この計算を処理するよりはるかに良い方法です。しかし、私は 'hitTest:withEvent:'を使う答えを編集しました。それはいくつかの理由から私の好みの方法でしょう。その1つは、不規則な形のビューです。ビューが不規則な形(例えば円の領域に触れただけの円)で表示された場合このケースは、私が行っていた手動計算では正しく処理されませんでした。再度、感謝します。 – NJones

+0

ようこそ。 :-) – Aufwind

関連する問題