14

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

3 回答 3

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.
 }
于 2012-10-03T14:40:41.680 回答
0

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

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

您的实现应如下所示:

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

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

因为这个实现从不返回任何子视图,所以没有一个 UIButton 有机会响应触摸。

于 2012-09-20T19:27:26.767 回答
0

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

于 2012-09-20T19:39:14.017 回答