在编程式创build的UIView层次结构上添加子视图

我有一个UIView子类以编程方式创build并添加了一些子视图。 然而,我想给这个类的用户提供使用addSubview并且理想的情况下在Interface Builder中放置新子视图的能力(及其子视图)。

做这个的最好方式是什么?

现在,我认为只能使用addSubview以编程方式添加视图是可以接受的,但是我不知道如何去做这件事。

注:我已经尝试使用接口生成器添加额外的子视图,但是一旦我上面提到的自定义UIView子类以编程方式创build其他视图,它们就隐藏起来了,大概是因为它们是最后添加的。

只需将一个通用UIView拖放到Interface Builder中的一个nib中,并将其类设置为您的自定义子类。 你仍然可以用一个普通的旧UIView做所有事情,包括拖放子视图。

在Interface Builder中,你将无法看到自定义子视图的实际外观。 它将只是一个灰色的矩形。 你可以(我认为)在Xcode 3中用IB插件完成了这个工作,但是至less目前来说,Xcode 4不支持这种插件。

编辑:

为了解决OP的后续问题,您需要以编程方式pipe理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顺序; 通过将它们放在一个易于pipe理的容器中,您可以将整个集合移到子视图层次结构中的任何位置。