1

iOS 6 の新しい UICollectionView を利用するアプリを構築しています。ただし、ユーザーが後で指を動かしても無視されるように、長押し動作を実装する必要があります。

すなわち

User touches the screen than instantly moves -> Swipe
User touches the screen, pauses, then moves -> Ignore swipe and wait for the release.

基本的に、ジェスチャ認識機能が失敗した場合にのみ、組み込みのスワイプ ジェスチャを有効にできるようにしたいと考えています。ただし、組み込みのスワイプ ジェスチャ レコグナイザーを「他のレコグナイザーが最初に失敗する必要がある」というロジックに置き換える方法はわかりません。

それがAppleのガイドラインに違反しているかどうかわからないので、UIScrollViewを見つけようとしてチェーンをたどることが許されているかどうかはわかりません. .

では、組み込みの認識機能に取って代わる、タップしてホールドする認識機能を作成するにはどうすればよいでしょうか?

4

2 に答える 2

8

UICollectionView プログラミング ガイドの 36 ページに例があります。

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];

元の答え

を見てくださいUITapGestureRecognizerDelegate。これは、2 つのジェスチャ レコグナイザが一度にタッチを処理できるようにするために使用できます。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {        
     return YES;
}

詳細については、次のようなチュートリアルを参照してください。

http://www.raywenderlich.com/6567/uigesturerecognizer-tutorial-in-ios-5-pinches-pans-and-more

于 2013-01-19T07:59:03.993 に答える
0

可能な状態からの新しいUILongPressGestureRecognizer遷移の前に、彼はその代理人に尋ねます。そのデリゲート メソッドを使用して、同じビューにアタッチされた他のジェスチャ レコグナイザーをキャンセル (強制的に失敗状態にする) ことができます。gestureRecognizerShouldBegin:

これを行うには、 new のデリゲートとして次を実装しますUILongPressGestureRecognizer

@implementation DragPictogramGestureRecognizerDelegate

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    for (UIGestureRecognizer *gr in gestureRecognizer.view.gestureRecognizers) {
        if ([gr isKindOfClass:[UILongPressGestureRecognizer class]] == NO) {
            gr.enabled = NO;
            gr.enabled = YES;
        }
    }
    return YES;
}

@end

さらに、ユーザーが 1 本の指で new を使用し、同時にUILongPressGestureRecognizer別の指を使用してスクロールできるようにするために、同じクラスに次のデリゲートを実装できます。UICollectionView

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}
于 2014-08-19T08:18:49.693 に答える