UITapGestureRecognizer on UIView and Its Subview R

2019-02-18 11:34发布

UITapGestureRecognizer is applied to both UIImageView and its subview (UITextView). However, when I tap on subview, the receiver becomes subview and its parent view (i.e. UIImageView + UITextView). It should however be only subview because that was the one I tapped. I was assuming nested gestures would react first but apparently parent receives the fist tap and then it goes to child.

So, there are different solutions out there for various scenarios (not similar to mine but rather buttons inside scroll view conflict). How can I easily fix my issue without possible subclassing and for iOS 6+ support? I tried delaying touch on start for UIGestureRecognizer on UIImageView and I tried setting cancelsTouchesInView to NO - all with no luck.

3条回答
劫难
2楼-- · 2019-02-18 11:53

That's exactly what is it supposed to do. View hierarchy is like a tree structure and its traversal during a touch gesture starts from the root node. It is very likely for your parent view to receive gesture first and then its subviews. The traversal skips the nodes for which

userInteractionEnabled = NO.

since, you don't have any code I can't help you to play with this flag. A more general solution is to always set gesture only for your parentView and in the gesture delegates check the coordinates if it belongs to any one of the subview and if yes then call your gesture method for your subview. Not a clean approach but works. !!

查看更多
可以哭但决不认输i
3楼-- · 2019-02-18 11:56

Try the following code:

conform the <UIGestureRecognizerDelegate> to your class.

set yourGesture.delegate = self;

then add this delegate Method:

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

Hope it will solve your issue. Enjoy Coding..!!!!

查看更多
beautiful°
4楼-- · 2019-02-18 12:09

you should implement the UIGestureRecognizer delegate methods and apply the correct policy to the gesture, when multiple gesture are recognized

查看更多
登录 后发表回答