我想创建一个UIView
动画下雨的动画,它应该在所有其他视图之上,在最前面,但透明,它根本不应该注册点击或交互,所以点击它后面的 UI 应该完全正确就像现在一样,在我实施它之前。它会作为一个覆盖,仅此而已。
这就像设置一样简单UserInteractionEnabled
,NO
还是还有更多?我是否需要子类化UIView
或覆盖某些东西等?
我想创建一个UIView
动画下雨的动画,它应该在所有其他视图之上,在最前面,但透明,它根本不应该注册点击或交互,所以点击它后面的 UI 应该完全正确就像现在一样,在我实施它之前。它会作为一个覆盖,仅此而已。
这就像设置一样简单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: 的实现做了以下事情:
它调用 pointInside:withEvent: of self
如果返回为 NO,hitTest:withEvent: 返回 nil。故事的结局。
如果返回是 YES,它会发送 hitTest:withEvent: 消息到它的子视图。它从顶级子视图开始,并继续到其他视图,直到子视图返回非零对象,或者所有子视图都收到消息。
如果子视图第一次返回非零对象,则第一个 hitTest:withEvent: 返回该对象。故事的结局。
如果没有子视图返回非nil对象,则第一个hitTest:withEvent:返回self这个过程递归地重复,所以通常最终返回视图层次结构的叶子视图。
但是,您可能会覆盖 hitTest:withEvent 以执行不同的操作。在许多情况下,覆盖 pointInside:withEvent: 更简单,并且仍然提供足够的选项来调整应用程序中的事件处理。