UIView上的UITapGestureRecognizer及其子视图在点击子视图时一起响应

时间:2013-10-25 14:29:59

标签: ios iphone objective-c uiview uigesturerecognizer

UITapGestureRecognizer适用于UIImageView及其子视图(UITextView)。但是,当我点击子视图时,接收器变为子视图及其父视图(即UIImageView + UITextView)。但它应该只是子视图,因为那是我点击的那个。我假设嵌套手势会先做出反应,但显然父母接受了第一次敲击然后它会转到孩子身上。

因此,对于各种场景有不同的解决方案(与我的不同,而是滚动视图内的按钮冲突)。如何在没有可能的子类化和iOS 6+支持的情况下轻松解决我的问题?我尝试在UIGestureRecognizer上推迟UIImageView上的触摸,我尝试将cancelsTouchesInView设置为NO - 所有这些都没有运气。

3 个答案:

答案 0 :(得分:10)

请尝试以下代码:

符合< UIGestureRecognizerDelegate>到你的班级。

设置yourGesture.delegate = self;

然后添加此委托方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    // return YES (the default) to allow the gesture recognizer to examine the touch object, NO to prevent the gesture recognizer from seeing this touch object.
    if([touch.view isKindOfClass: [UITextView class]] == YES)] {
        return YES;
    }
    else {
        return NO;
    }
}

希望它能解决您的问题。享受编码.. !!!!

答案 1 :(得分:3)

这正是它应该做的。 视图层次结构类似于树结构,并且在触摸手势期间从根节点开始遍历。您的父视图很可能首先接收手势然后接收其子视图。遍历跳过了

的节点
  

userInteractionEnabled = NO。

因为,你没有任何代码我无法帮你玩这个标志。更通用的解决方案是始终仅为您的parentView设置手势,并且在手势委托中检查坐标是否属于任何一个子视图,如果是,则调用您的子视图的手势方法。 不是一个干净的方法,但有效。 !!

答案 2 :(得分:0)

当识别出多个手势时,您应该实现UIGestureRecognizer委托方法并将正确的策略应用于手势