UIControl 子类 - 如何停止触摸事件流?

Posted

技术标签:

【中文标题】UIControl 子类 - 如何停止触摸事件流?【英文标题】:UIControl subclass - how to stop touch event flow? 【发布时间】:2014-02-28 12:20:26 【问题描述】:

我正在编写一个棋盘游戏应用程序(如国际象棋)。主视图可识别在其全屏视图中的任何位置启动的滑动手势 (UISwipeGestureRecognizer),这会使板旋转。

现在我在棋盘上添加了一个方形透明子视图。这是一个 UIControl 子类,用于检测触摸 - 作为棋子在棋盘上的移动:

[self.view addSubview:self.boardControl]

我预计滑动手势将在 UIControl 子类覆盖的屏幕区域被阻止。他们不是。因此,当我在我的方形 boardControl 上快速触摸并拖动(滑动)时,它首先被检测为棋子移动,但随后再次被检测为旋转板的滑动。

如何使我的 UIControl 子类阻止从其框架开始的触摸事件流到其父视图?


我可以通过在超级视图级别过滤触摸来阻止我的应用对滑动手势做出反应,方法是:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

    CGPoint location = [gestureRecognizer locationInView:self.view];
    CGRect frame = self.boardControl.frame;
    if ( CGRectContainsPoint(frame, location) )
        return NO;
    return YES;

或通过:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
       shouldReceiveTouch:(UITouch *)touch

    CGPoint location = [touch locationInView:self.view];
    CGRect frame = self.boardControl.frame;
    if (CGRectContainsPoint(frame, location))
        return NO;
    return YES;

但我想早一点解决这个问题:我希望 boardControl 在其框架触摸事件中不传递任何开始,在视图层次结构中更高。

UIControl 的子类能否“覆盖”它的父视图,并“吃掉”它获得的所有触摸,因此父视图不需要访问其框架来猜测是否必须过滤掉这样的触摸?

【问题讨论】:

【参考方案1】:

您所需要的只是实现UIGestureRecognizerDelegate 提供了制作请求事物的方法。

我觉得你应该从gestureRecognizer:shouldReceiveTouch:例子开始

【讨论】:

你的意思是这样的吗:` - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer CGPoint location = [gestureRecognizer locationInView:self.view]; CGRect 框架 = self.boardControl.frame; if ([gestureRecognizer isKindOfClass:[UISwipeGestureRecognizer class]] && CGRectContainsPoint(frame, location)) 返回 NO; `这可行,但是我希望我的 boardControl 不会通过任何在其视图中开始的触摸/手势。这不可能吗? 此代码有效,但我希望我的 boardControl 不通过在其视图中开始的任何触摸/手势。这不可能吗? (抱歉,我没有设法将我之前的评论格式化为代码)。 将代码添加到问题中,是的,这段代码看起来正确,您是否尝试过实现gestureRecognizer:shouldReceiveTouch 如果是,请同时更新问题

以上是关于UIControl 子类 - 如何停止触摸事件流?的主要内容,如果未能解决你的问题,请参考以下文章

被覆盖的 UIControl 或 UIView 如何知道在其上方结束的触摸事件?

如何取消对子 UIControl 的触摸?

如何正确子类UIControl?

如何忽略触摸事件并将它们传递给另一个子视图的 UIControl 对象?

UIControl 如何将所有触摸事件传递给响应者链中的下一个对象?

如何为自定义 UIControl 添加触摸事件并在 swift 5 中确定触摸的项目