0

メインのビューコントローラーには、uislider があります。同時に、ビュー全体でジェスチャーを検出したいので、UISwipeGestureRecognizer を self.view に割り当てます。

問題は、スライダーをスライドさせるたびにジェスチャ レコグナイザーがそれをキャプチャし、スライダーの動作がぎくしゃくして良くないことです。

これが私のコードです(ジェスチャー部分)

UISwipeGestureRecognizer* singleSwipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeRight:)];
    [singleSwipeRight setDirection:(UISwipeGestureRecognizerDirectionRight)];
    singleSwipeRight.numberOfTouchesRequired = 1;
    singleSwipeRight.delegate = self;
    [self.view addGestureRecognizer: singleSwipeRight];

HEREで読んだように、これを防ぐには、次のデリゲートを実装するだけです。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {


    if ([touch.view isKindOfClass:[UISlider class]]) {
        // prevent recognizing touches on the slider
        //NSLog(@"no");
        return NO;
    }
    return YES;

}

しかし、面白いことに、これは UISlider をスライドさせた 2 回目にしか機能しません。初めてのスワイプは常にジェスチャ認識ハンドラに行きます。

なんで?そして、これを解決する方法は?

ありがとう。

4

2 に答える 2

1

shouldReceiveTouchメソッドに、次の行を追加します。

NSLog(@"touch.view class = %@", [touch.view className]);

これは、最初のタッチで取得するもののクラス名を示します。

phaseプロパティもチェックする必要があります。スワイプが完了したときにのみ戻りたい場合がありYESます(アプリの動作によって異なります)。

于 2012-07-01T14:20:46.537 に答える
1

スライダーにパン ジェスチャ レコグナイザーを追加し、ターゲットもセレクターも指定しないでください (他のジェスチャ レコグナイザーが機能しなくなります)。プロパティを NO に設定すると、スライダーが正しく追跡されます。

    UIPanGestureRecognizer* panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:nil action:nil];
[slider addGestureRecognizer:panGesture];
panGesture.cancelsTouchesInView = NO;

それでおしまい!

于 2013-03-20T09:16:21.637 に答える