无法在viewDidAppear之前正确设置框架

时间:2012-10-26 00:16:55

标签: objective-c ios uiview viewdidload viewdidappear

我想知道是否有人知道为什么当您在viewDidLoadviewWillAppear设置子视图的框架时,更改不会在屏幕上生效,但如果您在{{1}中设置它他们呢?

在我的情况下,我正在加载一个带有两个tableviews的自定义xib,然后尝试在viewDidAppear中将它们向下移动,以便为viewDidLoad中添加的另一个视图留出空间,因为并不总是需要显示它

问题是当我在viewDidLoadviewDidLoad中设置框架时,我可以通过将其打印出来来查看,但它不会反映在屏幕上。将我的设置框架调用移动到viewWillAppear将导致一切按预期工作。

认为我应该能够在viewDidAppear中设置框架是错误的吗?

viewDidLoad

3 个答案:

答案 0 :(得分:95)

在加载类时调用viewDidLoad但是没有初始化ui元素,因此在viewDidLoad和viewDidAppear调用之间的初始化过程中,任何引用它们的尝试都将被覆盖或不可用。一旦所有ui元素都被初始化并且调用了viewDidAppear,就会调用它。

  

viewDidLoad -   控制器视图加载到内存后调用

此时视图不在视图层次结构中。

  

viewWillAppear - 通知视图控制器其视图即将添加到视图层次结构中。

同样,视图尚未添加到视图层次结构中。

  

viewDidAppear - 通知视图控制器其视图已添加到视图层次结构中。

只有这样才能将视图添加到视图层次结构中。

<强>更新

viewDidLayoutSubviews是在用户实际显示在屏幕上之前修改用户界面的最佳位置。

  

viewDidLayoutSubviews - 通知视图控制器其视图刚刚布置了其子视图。

答案 1 :(得分:2)

查看此帖子When is layoutSubviews called?
使用autolayout时,框架不会自动调用layoutSubviews。这非常重要。来自ref:

  • init不会导致调用layoutSubviews(duh)
  • addSubview:导致在添加的视图,要添加到的视图(目标视图)以及目标的所有子视图上调用layoutSubviews。 ...


如果在viewDidLoad中添加子视图,则在viewDidAppear之前调用layoutSubviews,您可以获得正确大小的子视图。但如果你什么都不做,layoutSubviews将在viewDidAppear之后调用。这取决于你的代码。

答案 2 :(得分:0)

在viewWillAppear()

只需为要获取其帧的视图调用layoutIfNeeded()一次。

如果tableView然后tableView.layoutIfNeeded()为exmple