跟随UIGestureRecognizer监听UITouch事件

7

我正在创建一个自定义的UIView,并在其上添加UITapGestureRecognizer。我有一个处理触摸手势的处理程序。但是同时我希望我的UIView也能监听touchesBegan和touchesEnded方法。我已经实现了gestureRecognizer:shouldReceiveTouch:方法,但是touchesBegan/touchesEnded方法没有被调用。有什么线索吗?

在我的自定义UIView内部

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)iGestureRecognizer shouldReceiveTouch:(UITouch *)iTouch {
    return YES;
}

在我的视图控制器内部

MyCustomView aCustomView = [[[MyCustomView alloc] init] autorelease];
                UIGestureRecognizer *myGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
[aCustomView addGestureRecognizer:myGestureRecognizer];
                [myGestureRecognizer release];

我一直以为touchesBegan只适用于主视图控制器的视图。 - CodaFi
2个回答

10

您需要将cancelsTouchesInView(以及可能的delaysTouchesBegandelaysTouchesEnded)设置为NO,用于手势识别器。手势识别器的默认行为是避免同时让其和视图处理触摸。这些设置可以让您对该行为进行微调。


我真希望我能得到你提到的那种行为。我正在使用默认设置,但我的触摸方法仍然被调用。请参见我的问题:https://dev59.com/zXDYa4cB1Zd3GeqPCqVn - johnbakers
@RobNapier,不将cancelsTouchesInView放置在这里是否与我的问题有关:https://stackoverflow.com/questions/46170876/random-crash-on-pickerview-didselect-cfrunloop-is-calling-out-to-a-source1-p?noredirect=1#comment79305779_46170876 - user2363025

0
如前所述,您需要在UITapGestureRecognizer上设置cancelTouchesInView属性为NO
来自Apple文档:

cancelsTouchesInView-如果手势识别器识别其手势,则将该手势的其余触摸取消绑定其视图(因此窗口不会将它们传递)。窗口使用(touchesCancelled:withEvent:)消息取消之前传递的触摸。如果手势识别器无法识别其手势,则视图接收多点触摸序列中的所有触摸。

进一步阅读:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizer_Class/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接