26

ジェスチャー関連の問題が発生しました。UISwipeGestureRecognizerを実装して、左右のスワイプイベントを取得しましたが、これは正常に機能しています。しかし、私が直面している問題は、同じビューにあるUISliderがうまく機能していないことです。スライダーのスライド動作は、左右のスワイプと間違えられています。

誰かが以前にこの問題を経験しました、それを修正する方法について何かアイデアがありますか?

どうもありがとう。

ビューコントローラに含まれるコードは次のとおりです。

 - (void)viewDidLoad {

            [super viewDidLoad];

                //Setup handling of LEFT and RIGHT swipes
             UISwipeGestureRecognizer *recognizer;

                recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
                [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
                [[self view] addGestureRecognizer:recognizer];
                [recognizer release];

                recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
                [recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
                [[self view] addGestureRecognizer:recognizer];
                [recognizer release];
        }

    -(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {

      if (recognizer.direction == UISwipeGestureRecognizerDirectionRight) {
       NSLog(@"Swipe Right");
       //Do stuff
      }

      if (recognizer.direction == UISwipeGestureRecognizerDirectionLeft) {
       NSLog(@"Swipe Left");
       //Do stuff
      }
    }
4

3 に答える 3

58

これを処理する最も簡単な方法は、おそらくジェスチャーレコグナイザーがスライダーのタッチを認識しないようにすることです。自分を代理人として設定し、実装することでそれを行うことができます

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isKindOfClass:[UISlider class]]) {
        // prevent recognizing touches on the slider
        return NO;
    }
    return YES;
}

これが機能しない場合は、スライダーに実際にタッチを受け取るサブビューがある可能性があるため、superviewチェーンを上って、途中で各ビューをテストできます。

于 2011-01-22T03:40:16.233 に答える
3

Swift4.0バージョン。UIGestureRecognizerDelegateを忘れないでください。

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {

    if let touchedView = touch.view, touchedView.isKind(of: UISlider.self) {
        return false
    }

    return true
}
于 2019-01-09T13:40:35.540 に答える
0

リリーが上記で応答する直前に、私はこれを機能させることになりました。これが私が使用したコードですが、リリーはよりきれいに見えます(リリーの汝をテストしていません):

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    BOOL AllowSwipes = YES;

        CGPoint point1 = [touch locationInView:_sliderLeft];
        CGPoint point2 = [touch locationInView:_sliderRight];

        //Left slider test
        if ([_sliderLeft hitTest:point1 withEvent:nil] != nil) {
            AllowSwipes = NO;
            NSLog(@"On Left Slider");
        }

        //Right slider test
        if ([_sliderRight hitTest:point2 withEvent:nil] != nil) {
            AllowSwipes = NO;
            NSLog(@"On Right Slider");
        }
    }
    return AllowSwipes;
}
于 2011-01-22T15:44:19.090 に答える