この質問と同様の問題で、インスタンスにダブルタップ ジェスチャ認識エンジンを追加しようとしていUICollectionView
ます。
デフォルトのシングル タップでUICollectionViewDelegate
メソッドが呼び出されないようにする必要がありますcollectionView:didSelectItemAtIndexPath:
。
これを実現するために、Apple のコレクション ビュー プログラミング ガイド(リスト 4-2)から直接コードを実装します。
UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; NSArray* recognizers = [self.collectionView gestureRecognizers]; // Make the default gesture recognizer wait until the custom one fails. for (UIGestureRecognizer* aRecognizer in recognizers) { if ([aRecognizer isKindOfClass:[UITapGestureRecognizer class]]) [aRecognizer requireGestureRecognizerToFail:tapGesture]; } // Now add the gesture recognizer to the collection view. tapGesture.numberOfTapsRequired = 2; [self.collectionView addGestureRecognizer:tapGesture];
このコードは期待どおりに動作しません。tapGesture
ダブル タップで起動しますが、既定のシングル タップは防止されず、デリゲートのdidSelect...
メソッドは引き続き呼び出されます。
デバッガーをステップ実行すると、if 条件[aRecognizer isKindOfClass:[UITapGestureRecognizer class]]
が true に評価されないため、新しい条件の失敗要件tapGesture
が確立されていないことがわかります。
for ループのたびに次のデバッガー コマンドを実行します。
po (void)NSLog(@"%@",(NSString *)NSStringFromClass([aRecognizer class]))
デフォルトのジェスチャ レコグナイザーは (実際には)UITapGestureRecognizer
インスタンスではないことがわかります。
代わりに、プライベート クラスUIScrollViewDelayedTouchesBeganGestureRecognizer
とUIScrollViewPanGestureRecognizer
.
まず、プライベート API に関する規則に違反しない限り、これらを明示的に使用することはできません。UIScrollViewDelayedTouchesBeganGestureRecognizer
第 2 に、ビアにアタッチしてrequireGestureRecognizerToFail:
も目的の動作が得られないようです。つまり、デリゲートdidSelect...
がまだ呼び出されています。
UICollectionView
のデフォルトのジェスチャ認識機能を使用して、コレクション ビューにダブル タップを追加し、デフォルトのシングル タップでもデリゲートのcollectionView:didSelectItemAtIndexPath:
メソッドが起動されないようにするにはどうすればよいですか?
前もって感謝します!