3

我想创建一个UIView动画下雨的动画,它应该在所有其他视图之上,在最前面,但透明,它根本不应该注册点击或交互,所以点击它后面的 UI 应该完全正确就像现在一样,在我实施它之前。它会作为一个覆盖,仅此而已。

这就像设置一样简单UserInteractionEnabledNO还是还有更多?我是否需要子类化UIView或覆盖某些东西等?

4

2 回答 2

2

是的,设置userInteractionEnabled = NO;不需要继承 UIView。例如:

UIView *overlay = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
overlay.backgroundColor = [UIColor colorWithWhite:0 alpha:.5];
[self.view addSubview:overlay];
于 2013-03-12T11:20:05.507 回答
0

正如@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: 更简单,并且仍然提供足够的选项来调整应用程序中的事件处理。

于 2013-03-12T12:00:19.527 回答