【问题标题】:How to make UIView stop receiving touch events?如何让 UIView 停止接收触摸事件?
【发布时间】:2014-03-09 11:21:04
【问题描述】:

我正在开发一个应用程序,希望用户在多个 UIViews 上快速触摸和滑动,一旦用户的手指到达它,每个 UIViews 都应该执行一个动作。我有 很多 视图,所以我会迭代每个视图以查看触摸是否在其范围内,这是一种不可行的典型事情 - 只是太多的滞后。有没有其他方法可以将触摸事件从一个视图传递到另一个视图(即在第一个视图旁边)?我想也许有一些方法可以取消触摸事件,但我已经搜索过了,到目前为止都是空的。

我遇到的一个大问题是,如果我在视图控制器中实现触摸处理,touchesBegan 只会在第一次触摸时触发 - 如果用户触摸某物,然后在不移动食指的情况下点击其他东西, touchesBegan 或 touchesMoved 中都没有记录该点击。但是,如果我在 UIViews 本身中实现我的触摸处理,一旦视图注册触摸,如果用户没有抬起手指并移动它,则第一个视图周围的视图不会注册触摸。只有当用户抬起手指然后放回手指时,周围的视图才会记录触摸。

所以我的问题是,假设我有两个并排的视图,我的触摸处理代码是在视图中实现的,我将手指放在视图 1 上。然后我将手指滑到视图 2 上 - 做什么我需要做的是让视图 2 注册该触摸,它从视图 1 开始并且从未“结束”?

【问题讨论】:

    标签: ios uiview uiviewcontroller uitouch uievent


    【解决方案1】:

    UIViewuserInteractionEnabled属性设置为NO

    view.userInteractionEnabled = NO;
    

    【讨论】:

    • 试过了,但它不起作用。例如,假设视图 1 检测到触摸。然后它检测到触摸已经超出了它的边界,所以它设置自己 userInteractionEnabled = NO;不幸的是,视图 1 一直接收触摸事件 (touchesMoved),直到用户抬起手指,而视图 2 没有接收到触摸事件。
    【解决方案2】:

    UIView 具有以下属性:

    @property(nonatomic, getter=isUserInteractionEnabled) BOOL userInteractionEnabled
    

    【讨论】:

      【解决方案3】:

      好的,我知道发生了什么。问题是,我的视图是滚动视图的子视图,它本身就是我的主视图的子视图。使用scrollEnabled = NO,我可以触摸我的子视图-但显然滚动视图只是将初始触摸事件转发给我,并且所有后续触摸都是该初始事件的一部分。因此,我遇到了许多奇怪的问题,例如一个接一个地触摸两个视图,两个视图都会选择并突出显示,但是如果我将第一根手指从屏幕上移开两个视图都会取消选择。这不是我们想要的行为。

      所以我所做的是将滚动视图子类化并覆盖触摸处理方法以将事件发送到它的第一响应者,这是它的超级视图,这是我正在执行触摸处理的视图。现在可以了!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-25
        • 1970-01-01
        • 2012-02-17
        相关资源
        最近更新 更多