我想创建一个UIView,它将动画下落的雨,应该在所有其他视图的前面,非常透明,不能响应触摸或交互,因此在其后面敲击UI应该与实现之前完全相同。它将作为覆盖层,仅此而已。
这是否就像设置UserInteractionEnabled为NO那样简单,或者还有更多内容?我需要子类化UIView,还是覆盖某些东西等等?
这是否就像设置UserInteractionEnabled为NO那样简单,或者还有更多内容?我需要子类化UIView,还是覆盖某些东西等等?
是的,设置userInteractionEnabled = NO;
无需子类化UIView。例如:
UIView *overlay = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
overlay.backgroundColor = [UIColor colorWithWhite:0 alpha:.5];
[self.view addSubview:overlay];
在添加透明子视图后,您可以像@zenith所解释的那样使用hittest。
UIResponder中hitTest:withEvent:的实现如下:
它调用self的pointInside:withEvent:
如果返回值为NO,则hitTest:withEvent:返回nil。故事结束。
如果返回值为YES,则向其子视图发送hitTest:withEvent:消息。它从顶层子视图开始,并继续到其他视图,直到子视图返回非nil对象或所有子视图接收到该消息。
如果一个子视图在第一次返回一个非nil对象,则第一个hitTest:withEvent:返回该对象。故事结束。
如果没有子视图返回非nil对象,则第一个hitTest:withEvent:返回self。这个过程会递归重复,因此通常最终返回视图层次结构的叶子视图。
但是,您可能会覆盖hitTest:withEvent以执行不同的操作。在许多情况下,覆盖pointInside:withEvent:更简单,仍然提供了足够的选项来调整应用程序中的事件处理。