处理手势识别在iOS6的(Handling gesture recognizers in iOS6)

2019-07-31 18:41发布

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

这种新的自动处理解决,当你想点击按钮,而不是激活手势识别的问题,但是当你想要的手势识别行动创建一个新的问题

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

Answer 1:

我做这个要解决这个问题,改变它,你认为合适:

- (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.
 }


Answer 2:

虽然我不知道你为什么会把UIButtons那里,如果你不希望他们可挖,则可以通过重写防止子视图从接收触摸-hitTest:withEvent:您的视图包含的方法。

-hitTest:withEvent:默认返回,所以默认的“视图层次结构(包括自身)的接收器,它包含一个指定的点最远的后裔”,敲击按键之一,当您的视图包含将返回按钮。

实现应是这个样子:

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

所以,如果你的容器查看此被称为上包含触摸点,则返回本身和连接到它会得到触摸手势识别。

由于这种实现永远不会返回任何子视图,没有UIButtons的永远不会有机会到触摸作出反应。



Answer 3:

我知道这看起来简单,但你有没有考虑设置的UIButton的userInteractionEnabled属性设置为“否”? 这应该从命中测试和手势识别系统会自动将其删除。



文章来源: Handling gesture recognizers in iOS6