总结:应该如何UIViewController
知道其UIView的实例的大小初始化该视图的时候?
用于UIView的专用初始化方法是initWithFrame:(CGRect)frame
的方法。 这台架为新创建的UIView。 这种方法可以从被称为UIViewController's
的loadView方法,如果被请求的视图控制器的看法。 的文档UIViewController
相对于子类和视图的大小规定:
当创建您的视图层次的意见,你应该总是设置你的观点的自动尺寸属性。 当在屏幕上显示的图控制器,其根视图通常调整大小以适合可用的空间,这可以取决于窗口的当前方向和其他界面元素的存在下,例如在状态栏。
所以, UIViewController
实例应设置这些属性。 到目前为止好,在UIViewController
迄今不必知道它的看法有多大或会。
当的视图UIViewController
请求和视图属性是nil,视图控制器的的loadView方法被调用。 现在有一个问题,因为UIView
需要进行初始化,但是视图控制器仍然不知道这个观点应该是什么样的大小。 你应该有多大初始化看法? 凡在代码你确定视图大小?
你可以初始化为零矩形(视图CGRectZero
):
- (void)loadView {
self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
}
而让主叫方设置视图框,如下所示:
UIViewController *viewController = [[MyUIViewController alloc] init];
// next two lines are normally combined, but for clarity they are not now
UIView *view = viewController.view;
view.frame = CGRectMake(0, 0, 200, 200);
这就要求从视图控制器(viewController.view)的视图,因此加载其与所述的loadView方法图。 此方法的loadView初始化与一个视图CGRectZero
。 然后呼叫者设置其帧(view.frame = ...)
问题是,在视图框属性设置两次,可能会造成更多的重复工作,如果您的自定义UIView
在SETFRAME方法做了一些先进的布局(放置和调整大小子视图为例)。 你可以通过创建一个专用的初始化方法避免这种情况UIViewController
它已经要求一个的CGRect,您将存储在伊娃调用者。 在的loadView方法被调用的时候,可以使用此伊娃创建视图。
什么是去这里的好办法吗? 或者设置视图的框架两次(初始化CGRectZero
,事后设定),或给予UIViewController
用的CGRect新初始化方法(并因此给它一个帧属性)? 还是我失去了一些东西以及是否有其他的可能性?