1

我有一个简单的滑动手势,我希望它的优先级很低。我希望它被视图上的控件发生的事件取消。起初,我认为这很简单。当手势发生时很容易取消事件,但我似乎不能做相反的事情。

如果手势与任何可触摸的东西冲突,我的解决方案是取消手势。这是我一起破解的代码:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    CGPoint touch = [gestureRecognizer locationInView:self.view];
    return [self.view hitTest:touch withEvent:nil] == self.view;
}

我觉得这是解决问题的错误方法。我错过了什么?获取事件以取消手势的正确方法是什么?


有关更多上下文,我在视图中添加了两个 UISwipeGestureRecognizers(向左滑动和向右滑动)。视图中还有一个 UISlider(嵌入式 MPVolumeView 的一部分)。当我移动滑块来改变音量时,向左或向右滑动会触发。

4

1 回答 1

2

这是做你想做的事情的正确方法。您是在告诉手势识别器,它应该只在触摸直接在视图中时才开始,而不是在任何子视图中(根据hitTest:哪个好,因为它允许视图决定它们是否被击中)。

阻止它启动总是比事后取消它要好。但是,如果您确实想在手势开始后取消它,请设置enabled = NO然后再返回YES

如果您需要允许某些子视图而不是控件的手势,您可以测试返回的视图是否是(例如) usinghitTest:的子类。UIControlisKindOfClass:

我不知道这是什么类型的手势,但通常你不需要这样做,因为 UIKit 会自动找到想要触摸的最深视图,并且该视图会“吃掉”它们,因此外部手势识别器不会得到它们 - 但是我可以想象这对于识别器/控制的某些组合并不适用。

于 2012-06-23T13:07:34.947 回答