【发布时间】:2009-07-09 10:29:34
【问题描述】:
总结: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 = ...)
问题是视图上的 frame 属性设置了两次,如果您的自定义 UIView 在 setFrame 方法中进行一些高级布局(例如放置和调整子视图大小),可能会导致更多的工作。您可以通过为 UIViewController 创建一个专用的初始化方法来防止这种情况,该方法已经向调用者询问了一个 CGRect,您将其存储在一个 ivar 中。在调用 loadView 方法时,您使用此 ivar 创建视图。
去这里的好方法是什么?设置视图的框架两次(使用CGRectZero 初始化,然后设置),或者给UIViewController 一个带有CGRect 的新初始化方法(从而给它一个框架属性)?还是我错过了什么,还有其他可能性吗?
【问题讨论】:
标签: iphone model-view-controller uiview uiviewcontroller