与 UIGestureRecognizer 一起监听 UITouch 事件

Posted

技术标签:

【中文标题】与 UIGestureRecognizer 一起监听 UITouch 事件【英文标题】:Listening to UITouch event along with UIGestureRecognizer 【发布时间】:2012-03-20 00:49:28 【问题描述】:

我正在创建一个自定义 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只适用于主viewController的view。 【参考方案1】:

您需要将手势识别器的cancelsTouchesInView(可能还有delaysTouchesBegandelaysTouchesEnded)设置为NO。手势识别器的默认行为是避免让它和视图同时处理触摸。这些设置可让您微调该行为。

【讨论】:

我当然希望我得到你提到的那种行为。我正在使用默认设置,但我的触摸方法仍然被调用。在这里查看我的问题:***.com/questions/15869944/… @RobNapier 将无法在此处将 cancelsTouchesInView 与我的问题相关联:***.com/questions/46170876/…【参考方案2】:

如前所述,您需要将UITapGestureRecognizer 上的cancelTouchesInView 属性设置为NO

来自 Apple 文档:

cancelsTouchesInView——如果手势识别器识别出它的手势, 它会从他们的视野中解除该手势的剩余触摸(所以 窗口不会提供它们)。窗口取消之前的 使用 (touchesCancelled:withEvent:) 消息传递触摸。如果一个 手势识别器无法识别其手势,视图接收到 多点触摸序列中的所有触摸。

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

【讨论】:

以上是关于与 UIGestureRecognizer 一起监听 UITouch 事件的主要内容,如果未能解决你的问题,请参考以下文章

自动化运维设计难点:如何将“监”“管”“控”有效的结合在一起?

新法实施后,大数据助力上城卫监查处首例非法医疗美容案!

从 UITouch 对象调用 UIGestureRecognizer

UIGestureRecognizer 如何识别被点击的圆圈?

从另一个类调用选择器的 UIGestureRecognizer

iOS:从 UIGestureRecognizer 崩溃的关键窗口子视图元素