UIView,它的超级视图和touchesBegan:

Edu*_*lho 6 iphone touch uiview ipad uiresponder

假设我有一个UIViewController子类来处理一些UIViews.这些UIViews被添加为UIViewController view属性的子视图):

UIViewController中:

- (void)viewDidLoad {
    UIImageView *smallImageView...
    [self.view addSubview:smallImageView];

    UIButton *button..
    [self.view addSubview:button];

    UIView *bigUIView.. // covers the entire screen (frame = (0.0, 0.0, 1024.0, 768.0))
    [self.view addSubview:bigUIView];
...
}
Run Code Online (Sandbox Code Playgroud)

AFAIK,因为它bigUIView是最前面的视图并覆盖整个屏幕,它将接收touchesBegan:withEvent:和其他视图,例如button不会接收任何触摸事件.

在我的应用程序中bigUIView必须是最顶层的视图,因为它包含主要的用户界面对象(CALayers,实际上是主要的游戏对象),在动画时,必须位于所有其他辅助UI元素(UIButtons等)之上.但是,我希望能够在响应程序链中保留UIButtons和其他对象.

我尝试在bigUIView课堂上实现以下内容:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {    
    [self.superview touchesBegan:touches withEvent:event];

    ... hit test the touch for this specific uiview..
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. bigUIView的superview引用了UIViewController的view属性,它是否将触摸事件传播到它的所有子视图?
  2. bigUIView必须有,userInteractionEnabled = YES因为它也处理用户输入.
  3. 我无法将button/ smallImageView带到前面,因为它会出现在主要游戏对象(子层bigUIView)之上.

提前致谢.

jle*_*ehr 12

尝试覆盖pointInside:withEvent:bigUIView类返回NO如果该点是背景视图的其他子视图中的一个的帧的矩形的内部.由于它是这些其他视图的兄弟,因此命中测试机制将继续测试其他子视图并找到与用户触摸的点相对应的子视图.

Alos,考虑-touchesBegan:withEvent:UIViewController子类而不是类中实现事件阶段方法(等)bigUIView.iOS的插入视图控制器它们在响应链视图后面,所以事件消息将冒泡到视图控制器,除非其他子视图中的一个(例如,一个按钮)截获它.然后,视图控制器可以将您喜欢的任何消息发送到其任何视图.

  • 一种选择是通过控制器路由所有触摸事件消息,然后让控制器决定响应中发生了什么(部分通过向一个或多个视图发送消息).另一个选择是在`bigUIView`中的每个重写方法的末尾包含对`[super touchesBegan:withEvent:]`的调用,这将允许消息继续响应响应者链,以便它们被接收由'bigUIView`和它的控制器. (2认同)