在以编程方式创建的UIView层次结构之上添加子视图

时间:2012-02-09 20:04:36

标签: ios uiview uikit

我有一个UIView子类,它以编程方式创建并添加了许多子视图。但是,我想让该类用户能够使用addSubview在其上放置新的子视图(及其子视图),理想情况下也可以在Interface Builder中使用。

这样做的最佳方式是什么?

现在,我认为只使用addSubview以编程方式添加视图是可以接受的,但我不确定如何进行此操作。

注意:我尝试使用界面构建器添加其他子视图,但是一旦我上面提到的自定义UIView子类以编程方式创建其他视图,它们就被隐藏了,大概是因为它们最后添加了。

1 个答案:

答案 0 :(得分:3)

只需将通用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排序;通过将它们放在一个易于管理的容器中,您可以将整个集合移动到子视图层次结构中的任何位置。