1

長押しジェスチャでシンプルなビュー (黒い四角) を作成し、UIGestureRecognizerStateEnded をキャッチするまで画面 (UIGestureRecognizerStateChanged) にドラッグします。OK、これはうまくいきます。ここで、この黒い正方形のビューの追加のジェスチャー (UISwipeGestureRecognizer) を認識できるようにしたいと考えています。アルゴリズムは単純です。

  1. 長押しで黒い四角を作る
  2. 指が画面上に留まる
  3. 正方形ビューをドラッグ (setCenter:)
  4. スワイプして認識する UISwipeGestureRecognizer

問題は、長押しジェスチャが終了していない間、スワイプを認識できないことです (UIGestureRecognizerStateEnded)

#pragma mark - View lifecycle

- (void)loadView {
    [super loadView];

    // Long press
    self.longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(gestureAction:)];
    [self.longPressGestureRecognizer setDelegate:self];
    [self.view addGestureRecognizer:self.longPressGestureRecognizer];

    // Swipe
    self.swipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(gestureAction:)];
    [self.swipeGestureRecognizer setDelegate:self];
    [self.swipeGestureRecognizer setEnabled:NO];
    [self.view addGestureRecognizer:self.swipeGestureRecognizer];
}

#pragma mark - Gesture recognizer

- (void)gestureAction:(UIGestureRecognizer *)recognizer {

    // Swipe
    if ([recognizer isKindOfClass:NSClassFromString(@"UISwipeGestureRecognizer")]) {
        NSLog(@"swipeGestureRecognizer handled!!");
    }

    // Long press
    if ([recognizer isKindOfClass:NSClassFromString(@"UILongPressGestureRecognizer")]) {
        if (recognizer.state == UIGestureRecognizerStateBegan) {
            self.activeView = [[ItemView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
            [self.activeView setBackgroundColor:[UIColor blackColor]];
            self.activeView.center = [recognizer locationInView:self.view];
            [self.view addSubview:self.activeView];
        }
        else if (recognizer.state == UIGestureRecognizerStateChanged) {
            if (![self.swipeGestureRecognizer isEnabled]) {
                [self.swipeGestureRecognizer setEnabled:YES];
                NSLog(@"swipeGestureRecognizer enabled");
            }
            self.activeView.center = [recognizer locationInView:self.view];
        }
        else if (recognizer.state == UIGestureRecognizerStateEnded) {
            [self.swipeGestureRecognizer setEnabled:NO];
            NSLog(@"swipeGestureRecognizer disabled");
            [self.activeView removeFromSuperview];
            self.activeView = nil;
        }
    }
}

#pragma mark - UIGestureRecognizerDelegate

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    return YES;
}

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

PS 長押しで日付キャンバスにイベントを作成するときは、ネイティブのカレンダー アプリとまったく同じ動作が必要です。(長押しジェスチャを終了する前に) オブジェクトをスワイプすると、スムーズに消えます。

4

2 に答える 2

1

複数のジェスチャを同時に認識するには、UiGestureRecognizer プロトコルの次のデリゲート メソッドを使用する必要があります。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

ドキュメントへのリンクは次のとおりです。

編集

で、同じことをやってみたところ、はい、私の場合でも、長押しが終わるまでスワイプが認識されませんでした..!したがって、ビューを移動したい場合は、スワイプジェスチャーの代わりに PanGesture を使用してください..! それは私が試したばかりです.. :)

于 2012-10-04T08:39:14.653 に答える
0

enabled:NO でスワイプ認識機能をオフにします。つけておくことをお勧めします。たとえば、1 つのジェスチャが認識された回数を数えます。同じジェスチャを受信した場合は、このカウンターを追加しないでください。正しい順序で発生すると、アクションをオープン/フリーにする関数を設定します。

于 2012-10-04T07:56:39.207 に答える