摘要:UIViewController
在初始化该视图时应该如何知道其UIView实例的大小?何处确定UIView大小
UIView的专用初始化方法是initWithFrame:(CGRect)frame
方法。这为新创建的UIView设置了框架。如果请求该视图控制器的视图,则可以从UIViewController's
loadView方法调用此方法。的UIViewController
状态相对于子类化和视图大小的文档:
当创建视图 层次的意见,你应该总是设置您的看法 自动尺寸属性。 当显示 屏幕上的视图控制器,其根视图通常是 调整大小以适合可用的空间, 可以变化取决于 窗口的当前取向和 存在其他界面元素 如状态栏的。
因此,UIViewController
实例应该设置这些属性。迄今为止,迄今为止,UIViewController
并不需要知道其观点是多大还是将会如此。
当请求UIViewController
的视图并且视图属性为零时,将调用视图控制器的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,你可以将它存储在一个ivar中。在调用loadView方法时,您使用此ivar创建视图。
这里有什么好方法?将视图的框架设置两次(初始化为CGRectZero
,然后设置),或者给UIViewController
一个带有CGRect的新的初始化方法(从而给它一个框架属性)?或者我错过了一些东西,还有其他的可能吗?
的UIView的init方法实际上具有零矩形 – drvdijk 2009-07-09 12:43:16
现在我注意到调用initWithFrame,同时施加变换到一个视图中, layoutSubviews被调用。考虑到我在视图控制器的touchesMoved方法中应用了转换,在layoutSubviews中做了很多工作也不会被推荐... – drvdijk 2009-07-15 12:28:19