显然,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;
}
我做这个要解决这个问题,改变它,你认为合适:
- (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.
}
虽然我不知道你为什么会把UIButtons那里,如果你不希望他们可挖,则可以通过重写防止子视图从接收触摸-hitTest:withEvent:
您的视图包含的方法。
-hitTest:withEvent:
默认返回,所以默认的“视图层次结构(包括自身)的接收器,它包含一个指定的点最远的后裔”,敲击按键之一,当您的视图包含将返回按钮。
实现应是这个样子:
- (UIView *)hitTest:(CGPoint)aPoint withEvent:(UIEvent *)event {
if ([self pointInside:aPoint]) {
return self;
} else {
return nil;
}
}
所以,如果你的容器查看此被称为上包含触摸点,则返回本身和连接到它会得到触摸手势识别。
由于这种实现永远不会返回任何子视图,没有UIButtons的永远不会有机会到触摸作出反应。
我知道这看起来简单,但你有没有考虑设置的UIButton的userInteractionEnabled属性设置为“否”? 这应该从命中测试和手势识别系统会自动将其删除。