【问题标题】:UISlider + UISwipeGestureRecognizer Not Working First timeUISlider + UISwipeGestureRecognizer 第一次不工作
【发布时间】: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 时才有效。 第一次滑动总是转到手势识别器处理程序。

为什么?以及如何解决这个问题?

谢谢。

【问题讨论】:

    标签: xcode delegates uislider uiswipegesturerecognizer


    【解决方案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 出色的答案。我的挑战是滑块在用户完成滑过屏幕之前一直停止。这样就彻底解决了问题!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    相关资源
    最近更新 更多