摘要:在初始化那个视图时应该如何UIViewController
知道它的 UIView 实例的大小?
UIView 的专用初始化方法是initWithFrame:(CGRect)frame
方法。这将为新创建的 UIView 设置框架。UIViewController's
如果请求视图控制器的视图,则可以从 loadView 方法调用此方法。UIViewController
关于子类化和视图大小的状态文档:
在为视图层次结构创建视图时,您应该始终设置视图的自动调整大小属性。当视图控制器显示在屏幕上时,它的根视图通常会调整大小以适应可用空间,这可能会根据窗口的当前方向和其他界面元素(例如状态栏)的存在而有所不同。
因此,UIViewController
实例应该设置这些属性。到目前为止这么好,UIViewController
到目前为止不必知道它的观点有多大或将有多大。
当UIViewController
请求 a 的视图且视图属性为 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 = ...)
问题是视图上的 frame 属性设置了两次,如果您的自定义UIView
在 setFrame 方法中进行一些高级布局(例如放置和调整子视图大小),可能会导致更多的工作。您可以通过创建一个专用的初始化方法来防止这种情况,该方法UIViewController
已经向调用者询问了一个 CGRect,您将其存储在一个 ivar 中。在调用 loadView 方法时,您使用此 ivar 创建视图。
去这里的好方法是什么?设置视图的框架两次(用 初始化CGRectZero
,然后设置),或者给UIViewController
一个新的初始化方法和一个 CGRect (从而给它一个框架属性)?或者我错过了什么,还有其他可能性吗?