代码之家  ›  专栏  ›  技术社区  ›  Tyler

uiscrollview如何从它的子视图中窃取触摸?

  •  4
  • Tyler  · 技术社区  · 16 年前

    我希望能够创建自己的uiview容器子类,这些子类可以在其子视图之前首先对触摸做出反应。这很棘手,因为通常子视图接收触摸事件(通过 touchesBegan: 等)在超级视图之前。uiscrollview如何逆转这种情况?

    说清楚,我是 询问uiscrollview 行为 . 我知道它的作用,以及你通常如何使用它。我在问我如何能够干净地实现我自己的版本——不是因为我想这样做,而是因为我正在尝试构建利用类似行为的可重用容器视图。

    3 回复  |  直到 14 年前
        1
  •  12
  •   Vladimir    16 年前

    你可以实现 hitTest:withEvent: 你的方法 UIView 子类。

    这个方法被调用来检查哪个子视图必须接收touch事件,这样您就可以在它实际发生之前在那里执行一些操作。还可以更改必须接收事件的子视图。

        2
  •  3
  •   TechZen    16 年前

    [ 编辑: 好吧,不知怎么的,我把这个问题读成了与实际问题完全相反的问题。我把这个留在这里,以防有人好奇,但这与实际问题无关 ——TechZen

    滚动视图可以水平和垂直移动,因此它必须对所有触摸进行采样,以查看它们是否在滚动触摸。

    例如,在ScrollView中有一个水平滚动的滑块。用户触摸滑块。触摸是要滑动滑块还是水平滚动的开始?哪个应该优先?

    即使以编程方式,响应程序链也会从最底部的视图(最上面的视觉)向上移动,直到找到处理它的对象,在幕后,对触摸位置的处理从最上面的视图(即应用程序窗口)向下。大多数视图只是将此信息转发给子视图,然后子视图激活,然后将事件发送到要处理的响应程序链上。因为滚动整个视图是一个特殊的事件,并不真正属于普通的响应程序链,所以滚动视图会截取触摸位置的向下传递,以便在将触摸位置传递给子视图之前确定是否需要滚动。

        3
  •  2
  •   Shady Abdou    14 年前

    这是一个非常简单但有效的方法

    UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyBoard:)];
    gestureRecognizer.delegate = self;
    [scrollView addGestureRecognizer:gestureRecognizer];
    
    -(void) hideKeyBoard:(id) sender
    {
       // Do whatever such as hiding the keyboard
    }