UISlider + UISwipeGestureRecognizer 第一次不工作
Posted
技术标签:
【中文标题】UISlider + UISwipeGestureRecognizer 第一次不工作【英文标题】:UISlider + UISwipeGestureRecognizer Not Working First time 【发布时间】:2012-07-01 14:03:33 【问题描述】:在我的主视图控制器中,我有一个 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 时才有效。 第一次滑动总是转到手势识别器处理程序。
为什么?以及如何解决这个问题?
谢谢。
【问题讨论】:
【参考方案1】:在您的 shouldReceiveTouch
方法中,添加以下行:
NSLog(@"touch.view class = %@", [touch.view className]);
这将表明您初次接触时所获得的类名。
您还应该查看phase
属性;您可能只想在滑动完成后返回 YES
(取决于您的应用的工作方式)。
【讨论】:
刚刚检查过了。日志说 UIView。顺便说一句,我使用了 [touch.view class],该视图没有 className 属性。不知道如何进行。 UISlider 位于 self.view 中的另一个 UIView 内。这可能是原因吗?如果是这样,我该如何纠正这个问题?有什么想法吗? 是的,所以我从子视图中删除了滑块,现在它可以正常工作了。想知道是否可以检查另一个视图中的滑块。无论如何,谢谢! 没有。实际上它没有用。无论滑块是否在子视图内,即使我仔细触摸 UISlider,第一个视图仍被检测为 UIView。我会调查更多......希望我能找到一些东西。【参考方案2】:在滑块上添加平移手势识别器,并且不指定目标或选择器 (它会阻止其他手势识别器工作) 将该属性设置为 NO 允许滑块正确跟踪。
UIPanGestureRecognizer* panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:nil action:nil];
[slider addGestureRecognizer:panGesture];
panGesture.cancelsTouchesInView = NO;
就是这样!
【讨论】:
@Mayosse 出色的答案。我的挑战是滑块在用户完成滑过屏幕之前一直停止。这样就彻底解决了问题!谢谢!以上是关于UISlider + UISwipeGestureRecognizer 第一次不工作的主要内容,如果未能解决你的问题,请参考以下文章
UISlider thumbImage 无法退出 uislider 框架