6

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

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];
...
}

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..
}

笔记:

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

提前致谢。

4

2 回答 2

12

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

此外,请考虑在您的子类中而不是在类中实现事件阶段方法(-touchesBegan:withEvent:等)。iOS 在响应者链中的视图后面插入视图控制器,因此事件消息将冒泡到视图控制器,除非其他子视图之一(例如,按钮)拦截它。然后,视图控制器可以将您喜欢的任何消息发送到它的任何视图。UIViewControllerbigUIView

于 2011-02-07T16:07:52.920 回答
0

通常在响应者链中,事件被传递给超级视图,而不是子视图。无论如何,我会将事件中的点转换为按钮的本地坐标系,如果它命中,则向控制器发送一个动作。

于 2011-02-07T16:09:22.537 回答