我有一个简单的滑动手势,我想成为非常低的优先级。我希望它被为视图上的控件发生的事件所取消。一开始,我以为这很简单。当一个手势发生时,很容易取消事件,但我似乎做不到相反的事情。
我的解决办法是取消这个手势,如果它与任何可以触摸的东西发生冲突。下面是我破解的代码:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
CGPoint touch = [gestureRecognizer locationInView:self.view];
return [self.view hitTest:touch withEvent:nil] == self.view;
}我觉得这是解决问题的错误方法。我遗漏了什么?什么是让事件取消手势的正确方法?
关于更多的上下文,我在视图中添加了两个UISwipeGestureRecognizers (左滑动和右滑动)。视图中也有一个UISlider (嵌入式MPVolumeView的一部分)。当我移动滑块改变音量,左或右滑动会开火。
发布于 2012-06-23 13:07:34
这是做你想做的事的正确方法。您告诉手势识别器,只有当触摸直接在视图中时,它才应该开始,而不是任何子视图(根据hitTest:,这是好的,因为它允许视图决定它们是否被击中)。
总是最好是阻止它的开始,而不是试图取消它之后。但是,如果要在手势启动后取消该手势,请设置enabled = NO,然后再次返回到YES。
如果需要允许某些子视图(而不是控件)的姿态,则可以测试hitTest:返回的视图是否是使用isKindOfClass:的UIControl子类(例如)。
我不知道这是为了什么类型的手势,但通常您不需要这样做,因为UIKit会自动找到想要触摸的最深视图,而该视图会“吃掉”它们,这样外部手势识别器就不会得到它们--但是我可以想象,对于某些识别器/控件的组合,这种情况并不成立。
https://stackoverflow.com/questions/11160269
复制相似问题