Objective c 获取UIEvent以取消UIgestureRecognitor

Objective c 获取UIEvent以取消UIgestureRecognitor,objective-c,ios,uigesturerecognizer,uievent,Objective C,Ios,Uigesturerecognizer,Uievent,我有一个简单的刷卡手势,我希望是非常低的优先级。我希望它被视图上控件发生的事件取消。起初,我认为这很简单。当一个手势发生时,取消事件很容易,但我似乎不能做相反的事情 我的解决办法是,如果手势与任何可触摸的东西冲突,就取消它。以下是我破解的代码: - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { CGPoint touch = [gestureRecognizer location

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

我的解决办法是,如果手势与任何可触摸的东西冲突,就取消它。以下是我破解的代码:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    CGPoint touch = [gestureRecognizer locationInView:self.view];
    return [self.view hitTest:touch withEvent:nil] == self.view;
}
我觉得这是解决问题的错误方法。我错过了什么?让事件取消手势的正确方法是什么



为了获得更多的上下文信息,我在视图中添加了两个UISweepGestureRecognitors(向左滑动和向右滑动)。视图中还有一个UISlider(嵌入式MPVolumeView的一部分)。当我移动滑块以更改音量时,将触发向左或向右滑动。

这是执行所需操作的正确方法。您告诉手势识别器,只有当触摸直接在视图中,而不是任何子视图中时,它才应该开始(根据
hitTest:
,这很好,因为它允许视图决定它们是否被击中)

最好是阻止它开始,而不是事后试图取消它。但是,如果您确实希望在手势开始后取消该手势,请将
enabled=NO
,然后再次返回到
YES

如果需要允许某些子视图的手势,但不允许控件,则可以使用
isKindOfClass:
测试
返回的视图是否是
UIControl
的子类(例如)


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

为问题添加了更多细节。当移动UISlider时,一个UISweepGestureRecognitor正在启动。啊,好吧-我想滑块不会阻止触摸在其他地方被使用。使用手势识别器的视图通常会阻止这种情况。在这种情况下,我认为这种方法是正确的。