この質問と同様の問題で、インスタンスにダブルタップ ジェスチャ認識エンジンを追加しようとしてい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:メソッドが起動されないようにするにはどうすればよいですか?
前もって感謝します!