凡确定UIView的大小(Where to determine UIView size)

2019-07-29 21:46发布

总结:应该如何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 = ...)

问题是,在视图框属性设置两次,可能会造成更多的重复工作,如果您的自定义UIView在SETFRAME方法做了一些先进的布局(放置和调整大小子视图为例)。 你可以通过创建一个专用的初始化方法避免这种情况UIViewController它已经要求一个的CGRect,您将存储在伊娃调用者。 在的loadView方法被调用的时候,可以使用此伊娃创建视图。

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

Answer 1:

不必使用指定的初始化。 只需使用初始化为[[UIView alloc] init] 指定初始化必须从子类初始化使用。

在另一方面,当设置了框两次不应该做多大的危害。 执行了很多任务的setFrame:是不寻常的。 布点在正常进行layoutSubviews并且只执行一次。



Answer 2:

我目前正试图从UIViewController的子类来创建一个通用组件后,完成同样的事情,来到注意到一些奇怪的很:

UIViewController中有一个可能会覆盖到(引用文档)一“的loadView”方法“这是子类应该创建自己的自定义视图层次”。

所以,我创造我的视图层次,使用默认帧大小(因为我可以不知道我应该显示的东西进入当时的loadView被称为帧)合成我的屏幕。

不过,在什么叫我正确设置帧大小? 又名:在什么时候是我的看法控制器意识到它的观点真实大小的?

我必须在我的ViewController子类来创建一个“SETFRAME”即创建视图 - 控制的对象应该打电话? 这似乎不可思议。

drvdijk:你有一个解决问题了吗?

编辑:刚刚发现这个注释上的UIViewController文档:注意:您不应该使用视图控制器来管理意见只能填充其窗口,也就是说,只能由应用程序内容矩形定义的区域的一部分的一部分。 如果你想有几个较小的观点组成的接口,将它们嵌入在一个单一的根视图和管理您的视图控制器视图。

所以,似乎UIViewController的主要观点始终是全屏幕。 期。

这不构成问题对我来说,虽然,因为我试图创建一个自定义UITabBarViewController(能在使用TabBar显示自定义图像,而不是蓝色渐变):我tabBarViewController应该显示subviewcontrollers到只有窗口的一部分。 ..



Answer 3:

您可能要计算可用的屏幕空间(取决于来自像导航栏,标签栏和状态栏等观点存在)的边界。 您可以使用这些范围,然后在框架参数[[UIView alloc] initWithFrame:]中的loadView。

如果这是你想要的东西,那么你可能会发现我的答案在这里有所帮助: 确定的loadView正确的大小



文章来源: Where to determine UIView size