在哪里确定UIView大小

简介:初始化该视图时, UIViewController应该如何知道它的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 = ...)

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

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


您不必使用指定的初始化程序。 只需在[[UIView alloc] init]使用init即可。 指定的初始化器必须从子类的初始化器中使用。

另一方面,将框架设置两次不会造成太大的伤害。 在setFrame:执行很多任务setFrame:并不常见。 Layouts通常在layoutSubviews完成,仅执行一次。


我目前正在试图从UIViewController继承创建一个通用组件并且注意到一些相当奇怪的事情之后完成同样的事情:

UIViewController有一个“loadView”方法,您可以重写(引用文档)“这是子类应该创建自定义视图层次的地方”。

所以,我创建了我的视图层次结构,使用默认的帧大小合成我的屏幕(因为在调用loadView时我可能不知道应该显示的内容)。

但是,接下来,我会正确设置帧尺寸吗? 又名:我的视图控制器在什么时候意识到它的视图实际大小?

我是否必须在ViewController子类中创建一个“setFrame”,以创建viewcontroller的对象应该调用? 这似乎很奇怪。

drvdijk:你有解决你的问题的方法吗?

编辑:刚才在UIViewController文档中发现了这个注意事项:注意:你不应该使用视图控制器来管理只填充其窗口一部分的视图 - 也就是说,只有应用程序内容矩形定义的区域的一部分。 如果你想有一个由几个较小视图组成的界面,将它们全部嵌入到单个根视图中,并使用视图控制器来管理该视图。

所以,UIViewController主视图看起来总是全屏。 期。

但是,这确实对我造成了一个问题,因为我试图创建一个自定义的UITabBarViewController(为了能够在tabbar中显示自定义图像,而不是蓝色渐变):我的tabBarViewController应该只将子视图控件显示在窗口的一部分中。 ..


您可能想要计算可用屏幕空间的边界(这取决于导航栏,选项卡栏和状态栏等其他视图的存在情况)。 你可以在loadView的[[UIView alloc] initWithFrame:]中使用这些界限作为框架参数。

如果这是你想要的,那么你可能会在这里找到我的答案有用:确定loadView中的正确大小

链接地址: http://www.djcxy.com/p/81995.html

上一篇: Where to determine UIView size

下一篇: How to get the displayed image frame from UIImageView?