在以编程方式创建的 UIView 层次结构之上添加子视图
Posted
技术标签:
【中文标题】在以编程方式创建的 UIView 层次结构之上添加子视图【英文标题】:Adding subviews on top of a programmatically-created UIView hierarchy 【发布时间】:2012-02-09 20:04:35 【问题描述】:我有一个 UIView 子类,它以编程方式创建和添加许多子视图。但是,我想让该类的用户能够使用 addSubview 放置新的子视图(及其子视图),最好也可以在 Interface Builder 中。
最好的方法是什么?
现在,我想只使用 addSubview 以编程方式添加视图是可以接受的,但我也不知道该怎么做。
注意:我已经尝试使用界面生成器添加其他子视图,但是一旦我上面提到的自定义 UIView 子类以编程方式创建了其他视图,它们就会隐藏起来,大概是因为它们是最后添加的。
【问题讨论】:
【参考方案1】:只需将通用 UIView 拖到 Interface Builder 中的 nib 中,并将其类设置为您的自定义子类。您仍然可以使用普通的旧 UIView 做任何事情,包括拖放子视图。
您不会在 Interface Builder 中看到自定义子视图的实际外观;它只是一个灰色的矩形。您可以(我认为)在 Xcode 3 中使用 IB 插件完成此操作,但至少目前,Xcode 4 不支持此类插件。
编辑:
要解决 OP 的后续问题,您需要以编程方式管理 z 排序。可能最简单的做法是让您的代码保持原样,而不是执行以下操作:
UIView *mySubview1 = ...;
UIView *mySubview2 = ...;
UIView *mysubview3 = ...;
[self addSubview:mySubview1];
[self addSubview:mySubview2];
[self addsubview:mySubview3];
(正如您所指出的,它可以很好地将子视图分层放在用户的子视图之上)
执行以下操作:
UIView *container = [[UIView alloc] initWithFrame:[self bounds]];
UIView *mySubview1 = ...;
UIView *mySubview2 = ...;
UIView *mysubview3 = ...;
[container addSubview:mySubview1];
[container addSubview:mySubview2];
[container addsubview:mySubview3];
[self addSubview:container];
[self sendSubviewToBack:container];
[container release];
您也可以使用 [self insertSubview:container atIndex:0],但我认为在快速浏览代码期间添加和移到后面会更清楚一些。
最终结果是您不必弄乱子视图的现有 z 顺序;通过将它们放在一个易于管理的单一容器中,您可以将整个集合移动到子视图层次结构中您想要的任何位置。
【讨论】:
这是我最初尝试的。不幸的是,由于自定义类以编程方式添加了它的其他子视图,它们出现在我在 IB 中添加的视图之上。 我认为你应该这样做[self.view addSubview:mySubview1];
以上是关于在以编程方式创建的 UIView 层次结构之上添加子视图的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式将自定义 UIView 添加到 UIScrollView 之上的 Stackview?
无法在以编程方式创建的窗口中单击 iAd - 未调用bannerViewActionShouldBegin?