我想知道是否有人知道为什么当您在viewDidLoad
和viewWillAppear
设置子视图的框架时,更改不会在屏幕上生效,但如果您在{{1}中设置它他们呢?
在我的情况下,我正在加载一个带有两个tableviews的自定义xib,然后尝试在viewDidAppear
中将它们向下移动,以便为viewDidLoad
中添加的另一个视图留出空间,因为并不总是需要显示它
问题是当我在viewDidLoad
或viewDidLoad
中设置框架时,我可以通过将其打印出来来查看,但它不会反映在屏幕上。将我的设置框架调用移动到viewWillAppear
将导致一切按预期工作。
认为我应该能够在viewDidAppear
中设置框架是错误的吗?
viewDidLoad
答案 0 :(得分:95)
在加载类时调用viewDidLoad但是没有初始化ui元素,因此在viewDidLoad和viewDidAppear调用之间的初始化过程中,任何引用它们的尝试都将被覆盖或不可用。一旦所有ui元素都被初始化并且调用了viewDidAppear,就会调用它。
viewDidLoad - 控制器视图加载到内存后调用
此时视图不在视图层次结构中。
viewWillAppear - 通知视图控制器其视图即将添加到视图层次结构中。
同样,视图尚未添加到视图层次结构中。
viewDidAppear - 通知视图控制器其视图已添加到视图层次结构中。
只有这样才能将视图添加到视图层次结构中。
<强>更新强>
viewDidLayoutSubviews
是在用户实际显示在屏幕上之前修改用户界面的最佳位置。
viewDidLayoutSubviews - 通知视图控制器其视图刚刚布置了其子视图。
答案 1 :(得分:2)
查看此帖子When is layoutSubviews called?
使用autolayout时,框架不会自动调用layoutSubviews。这非常重要。来自ref:
如果在viewDidLoad中添加子视图,则在viewDidAppear之前调用layoutSubviews,您可以获得正确大小的子视图。但如果你什么都不做,layoutSubviews将在viewDidAppear之后调用。这取决于你的代码。
答案 2 :(得分:0)
在viewWillAppear()
中只需为要获取其帧的视图调用layoutIfNeeded()一次。
如果tableView然后tableView.layoutIfNeeded()为exmple