处理iOS6中的手势识别器

显然iOS 6会尝试自动处理这种情况,当你在同一个地方有一个手势识别器和一个UIButton ,为同一个手势激活。

这个新的自动处理解决了当你想单击button而不是激活手势识别器时的问题 ,但是当你希望手势识别器动作时, 会产生新的问题

在iOS 5中,您可以实现:

 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 

在发生冲突时将行动转移到UIButton

这似乎在iOS 6中不起作用。另外,反转此方法的行为(因为现在UIButton具有优先级而不是手势识别器)将不起作用。


完整的方法:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[UIControl class]]){ return NO; } return YES; } 

我已经这样做来解决这个问题,改变它,你认为合适的:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { [self MyCommonSelector];// this will work for ios 5 return Yes; } 

在声明的button中添加目标,以便在iOS 6中调用:

 [self.myButton addTarget:self action:@selector(MyCommonSelector) forControlEvents:UIControlEventTouchUpInside]; 

用这种方法做你的东西,这也将被称为button水龙头,从你需要调用的手势:

 -(void)MyCommonSelector { //Do your stuff here what you want to do with Gesture too. } 

虽然我不知道为什么你会把UIButtons放在那里,如果你不想让它们被窃听,你可以通过覆盖你的包含视图的-hitTest:withEvent:方法来阻止子视图接收触摸。

-hitTest:withEvent:默认情况下返回包含指定点的视图层次结构(包括它本身)中接收者的最远后裔“ ,所以默认情况下,当点击其中一个button时,包含视图将返回button。

你的实现应该看起来像这样:

 - (UIView *)hitTest:(CGPoint)aPoint withEvent:(UIEvent *)event { if ([self pointInside:aPoint]) { return self; } else { return nil; } } 

所以如果你的容器视图被调用的时候包含触摸点,它会自动返回,附加的手势识别器将会触摸。

因为这个实现永远不会返回任何子视图,所以UIButtons都不会有机会回应触摸。

我知道这似乎是简单的,但你有没有考虑设置UIButton的userInteractionEnabled属性为“否”? 这应该从命中testing和手势识别系统中自动移除它。