在哪里确定UIView的大小

drv*_*ijk 28 iphone model-view-controller uiviewcontroller uiview

简介:UIViewController在初始化该视图时,应该如何知道其UIView实例的大小?

UIView的专用初始化方法是initWithFrame:(CGRect)frame方法.这将为新创建的UIView设置框架.UIViewController's如果请求了视图控制器的视图,则可以从loadView方法调用此方法.UIViewController关于子类化和视图大小的状态文档:

为视图层次结构创建视图时,应始终设置视图的自动调整大小属性.当视图控制器显示在屏幕上时,其根视图通常会调整大小以适应可用空间,可用空间可能会根据窗口的当前方向和状态栏等其他界面元素的存在而变化.

因此,UIViewController实例应该设置这些属性.到目前为止一直很好,UIViewController到目前为止还没有必要知道它的观点有多大.

UIViewController请求a 的视图并且view属性为nil时,将调用视图控制器的loadView方法.现在有一个问题,因为UIView需要初始化,但视图控制器仍然不知道视图应该是多大.你应该初始化那个视图有多大?您在代码中确定视图大小的位置?

您可以使用零rect(CGRectZero)初始化视图:

- (void)loadView {
    self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
}
Run Code Online (Sandbox Code Playgroud)

让调用者像这样设置视图框:

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);
Run Code Online (Sandbox Code Playgroud)

这将从视图控制器(viewController.view)请求视图,从而使用loadView方法加载其视图.此loadView方法使用a初始化视图CGRectZero.然后调用者设置其框架(view.frame = ...)

问题是视图上的frame属性设置了两次,如果你的自定义UIView在setFrame方法中进行一些高级布局(例如放置和调整子视图),可能会导致更多的双重工作.您可以通过为UIViewController已经向调用者请求CGRect 的专用初始化方法来阻止这种情况,CGRect将存储在ivar中.在调用loadView方法时,使用此ivar创建视图.

去这儿的好方法是什么?或者设置视图的框架两次(初始化CGRectZero,事后设定),或给予UIViewController一个的CGRect新初始化方法(并因此给它一个帧属性)?或者我错过了什么,还有其他可能吗?

Nik*_*uhe 8

你不必须使用指定的初始化.只需使用init即可[[UIView alloc] init].必须从子类的初始值设定项中使用指定的初始值设定项.

另一方面,将帧设置两次不会造成太大伤害.执行大量任务setFrame:是不寻常的.Layouting通常在中进行,layoutSubviews并且只执行一次.

  • UIView的init方法实际上使用零rect调用initWithFrame (10认同)