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 框架

UIPan Gesture 和 UI Swipe Gesture 在同一个视图中

UISlider 损坏

UISlider的基本使用方法

UISlider 带标签怎么调用?

UISlider