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

斯威夫特 4.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

就在莉莉在上面做出回应之前,我最终完成了这项工作。这是我使用的代码,但 Lily 看起来更干净(还没有测试 Lily 的你):

- (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 回答