viewDidLoad 和 viewWillAppear 中的不同子视图布局 [重复]

Posted

技术标签:

【中文标题】viewDidLoad 和 viewWillAppear 中的不同子视图布局 [重复]【英文标题】:Different subview layouts in viewDidLoad and viewWillAppear [duplicate] 【发布时间】:2012-12-19 17:19:29 【问题描述】:

可能重复:UIViewController returns invalid frame?

在调试时我注意到在viewDidLoad 调用中我的视图框架是origin=(x=0, y=20) size=(width=320, height=460),这是不准确的。在viewWillAppear 调用中正确设置:origin=(x=0, y=0) size=(width=320, height=416) 考虑到导航栏的高度。 我的子视图布局取决于根视图,但我不想在每次视图出现时都设置它们。

我们应该如何处理这两个调用?

【问题讨论】:

像以前一样对待他们。在 -viewWillAppear 中进行视图设置,因为那是导航栏高度的原因,然后在 -viewDidLoad 中进行初始化。 【参考方案1】:

处理视图布局的正确位置是在UIViewController viewWillLayoutSubviews 方法中。每当视图控制器的视图调整大小时(例如首次显示时和旋转时)都会调用此方法。

如您所见,当调用viewDidLoad 时,视图控制器的视图尚未完全调整大小。

如果您需要支持 ios 4.3,那么您不能使用 viewWillLayoutSubviews,因为它是在 5.0 中添加的。在这种情况下,请在viewWillAppear: 中进行布局。

【讨论】:

应该注意的是,-viewWillAppear 可以在视图框架设置和窗口完成自身定向之前调用。如果你在 iOS 4 中需要它,你需要等待 -viewDidAppear 被调用。

以上是关于viewDidLoad 和 viewWillAppear 中的不同子视图布局 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

swift - 指定VC隐藏导航栏 - 禁用tabbar的根控制器手势,防止两个tabbar跳转 手势冲突

ecslidingviewcontroller和uislider

viewDidLoad 和 viewDidAppear 的区别

viewDidLoad和loadView之间的区别?

swift 中 awakeFromNib() 和 viewDidLoad() 之间的区别

关于 viewController 的“viewDidLoad”和“viewWillAppear”方法