边界和帧大小在viewDidLoad中(Bounds and Frame size in viewD

2019-09-23 07:01发布

我推视图控制器( mainVC )和一些子视图添加到它。 大部分的这些观点是建立在按需,为用户采取一些行动。

当我建立每个视图,我指的是mainVC.view.bounds大小的视图。 这是建立在需求的大小就好了的,但第一个(这是我在加viewDidLoad )似乎并没有占到任何隐藏的导航栏或工具栏取消隐藏-我不知道哪个。

其他问题似乎向我保证viewDidLoad中是指边界和添加这些子视图中的正确位置。 我是不是误导? 日志记录产生如下:

viewDidLoad的界限高度为548。

viewWillAppear的边界高度是460(-44×2)。 在viewWillAppear我隐藏导航栏,但高度是一样的之前和之后。

在所有以后的时间,边界高度是504(-44×1)。

为什么界限高度不是由我试图在阅读它的时候更新viewDidLoad

Answer 1:

视图控制器生命周期中所述视图控制器编程指南为iOS 。

总之,当-view被称为第一次, -viewDidLoad被调用。 即使视图控制器做的第一件事的视图设置框,它仍然需要访问视图。

UIViewController *controller = [MyViewController myViewController];

// -viewDidLoad has not been called (if +myViewController doesn't call -view.)

UIView *view = [controller view];

// -viewDidLoad has been called.

view.frame = [UIApplication sharedApplication].delegate.window.bounds;

即使您使用controller.view.frame相同的逻辑顺序发生。 -viewDidLoad将永远是一个调用尚未嵌入View层次结构中的新反序列化视图。


更新

它区分它不早清楚,我指出了为什么鉴于界限不正确设置-viewDidLoad 。 只有经过-viewDidLoad确实视图控制器的视图被添加到视图层次结构。 这是当视图的最后一帧被设置。

如果你必须有框架是正确的尺寸,你可以使用IB来设置你知道你需要或者(如果你不使用IB)设置在框架的尺寸-loadView 。 这种方法是有缺陷的,因为它静态设置帧的大小,可能以后被改变的值-viewDidLoad被调用(如通话中的状态栏的东西)。


更新2

您需要将添加子视图的位置和大小子视图分裂。

如果您是从故事板或笔尖加载,那么你应该加入需要正确的,额外的观点-viewDidLoad 。 如果你加载程序,那么所有的子视图中添加-loadView

第二个任务是定位和大小子视图。 首选的方法是使用UIView.autoresizingMask ,但更精确的布局, 志愿 view.bounds和调整您的自定义子视图时,视图控制器的看法改变其大小。



文章来源: Bounds and Frame size in viewDidLoad