有手势相关的问题。我实现了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
}
}
答案 0 :(得分:56)
处理此问题的最简单方法可能是阻止手势识别器看到滑块上的触摸。您可以通过将自己设置为委托,然后实现
来实现- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isKindOfClass:[UISlider class]]) {
// prevent recognizing touches on the slider
return NO;
}
return YES;
}
如果这不起作用,滑块实际上可能有接收触摸的子视图,因此您可以走superview
链,沿途测试每个视图。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
Swift 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
}