在通过编程创建的UIView层次结构上添加子视图

4
我有一个UIView子类,它以编程方式创建并添加了许多子视图。但是,我希望该类的用户能够使用addSubview在其上方(及其子视图)放置新的子视图,并最好还能从Interface Builder中实现。

最佳方法是什么?

现在,我想只使用addSubview以编程方式添加视图也是可以接受的,但我不确定如何去做。

注意:我已经尝试使用Interface Builder添加其他子视图,但是一旦上述自定义UIView子类以编程方式创建其其他视图后,它们就会被隐藏起来,可能是因为它们是最后添加的。

1个回答

3
只需将一个通用的 UIView 拖入 Interface Builder 中的 nib 文件,并将其类设置为您的自定义子类。您仍然可以像使用普通的 UIView 一样进行所有操作,包括拖放子视图。
您无法在 Interface Builder 中看到自定义子视图的实际外观;它只会是一个灰色的矩形。我认为您可能可以在 Xcode 3 中使用 IB 插件来完成此操作,但至少目前为止,Xcode 4 不支持此类插件。
编辑:
针对问题的后续处理,您需要通过编程方式管理 z-ordering。最简单的方法可能是让您的代码基本保持不变,但是不要像下面这样做:
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-ordering;通过将它们放在一个单独且易于管理的容器中,你可以将整个集合移动到子视图层次结构中任何你想要的位置。

这是我最初尝试的。不幸的是,由于自定义类通过编程方式添加其其他子视图,它们会覆盖我在 IB 中添加的视图。 - Tom
我认为你应该执行[self.view addSubview:mySubview1]; - Supertecnoboff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接