在iOS6中处理手势识别器

时间:2012-09-20 18:06:57

标签: ios ios6 uigesturerecognizer

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

当你想要点击按钮而不是激活手势识别器时,这种新的自动处理解决了这个问题,但是当你想让手势识别器动作时,会产生新的问题

在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;
}

3 个答案:

答案 0 :(得分:6)

我这样做是为了解决问题,根据您的需要进行更改:

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

在你声明的按钮中添加目标,这样就可以在iOS 6中调用:

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

在这个方法中做你的东西,也可以在按钮点击和你需要调用的手势上调用:

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

答案 1 :(得分:0)

虽然我不知道你为什么要把UIButton放在那里,如果你不希望它们被点击,你可以通过覆盖包含视图的-hitTest:withEvent:方法来防止子视图接收到触摸。

-hitTest:withEvent:默认返回视图层次结构中接收器的“最远的后代(包括其自身),其包含指定的点”,因此默认情况下,当点击其中一个按钮时,您的包含视图将返回按钮。

您的实现应该如下所示:

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

因此,如果您正在调用的容器视图包含触摸点,则它将返回自身并且附加到其上的手势识别器将获得触摸。

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

答案 2 :(得分:0)

我知道这看似简单,但你考虑过将UIButton的userInteractionEnabled属性设置为“NO”吗?这应该从命中测试和手势识别系统中自动删除它。