10

UIScrollViewビューコントローラーにいくつかの があります。スワイプ ジェスチャUIPanGestureRecognizerを記録しない2 本の指のスワイプをキャプチャするビューをオーバーレイしたいと考えています。UIScrollView

2 本指のパン ジェスチャでコンテンツに透明なビューを配置すると、タップと 1 本指のスワイプが検出されません。pointInside:戻るメソッドを上書きしようとしましNO たが、2 本指のスワイプが記録されません。

効果は、アプリを変更するための 4 本の指のスワイプに似ています。

4

2 に答える 2

3

オーバーレイが本当に必要ない場合は、ジェスチャー認識エンジンだけでこれを解決できます。私はこれをテストとして書きました:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
    _scrollView.contentSize = CGSizeMake(self.view.bounds.size.width * 2, self.view.bounds.size.height);

    UIView *green = [[UIView alloc] initWithFrame:self.view.bounds];
    [green setBackgroundColor:[UIColor greenColor]];

    UIView *blue = [[UIView alloc] initWithFrame:CGRectOffset(self.view.bounds, self.view.bounds.size.width, 0)];
    [blue setBackgroundColor:[UIColor blueColor]];

    [_scrollView addSubview:green];
    [_scrollView addSubview:blue];

    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(twoFingerPan:)];
    [pan setMinimumNumberOfTouches:2];
    [pan setMaximumNumberOfTouches:2];
    [pan setDelaysTouchesBegan:YES];

    [_scrollView addGestureRecognizer:pan];

    [self.view addSubview:_scrollView];
}

- (void)twoFingerPan:(UIPanGestureRecognizer *)gesture {
    switch (gesture.state) {
        case UIGestureRecognizerStateBegan:
            self.scrollView.scrollEnabled = NO;
            break;
        case UIGestureRecognizerStateCancelled:
        case UIGestureRecognizerStateEnded:
        case UIGestureRecognizerStateFailed:
            self.scrollView.scrollEnabled = YES;
            break;
        default:
            break;
    }
    NSLog(@"2 Fingers!");
}

2 本の指を使用するtwoFingerPan:とコールバックが返ってきます。スクロール ビューpanGestureRecognizerはその時点でまだ機能しているので、スクロール ビューのスクロールを無効にして 2 本の指のパンを処理します。この方法はかなりうまく機能することがわかりました。奇妙なことの 1 つは、スクロール ビューが減速している場合、2 本指ジェスチャ レコグナイザーが呼び出されないことです。それが役立つことを願っています!

于 2013-05-04T15:55:28.367 に答える