使用Storyboard时,为什么viewWillAppear不会绘制我的子视图和viewDidLayoutSubviews

时间:2013-01-11 20:38:02

标签: ios objective-c

使用故事板时,为什么 viewWillAppear 不能绘制我的子视图,而 viewDidLayoutSubviews 更有效,更重要的是访问 {{ 1}} 子视图的值我必须在 frame.size 中调用 [self.scroller layoutIfNeeded] ?我有兴趣了解视图控制器的页面生命周期以及从xibs到故事板的变化。

screenshot of view hierarchy

1 个答案:

答案 0 :(得分:2)

故事板实际上是作为xib文件的集合实现的,其中包含有关它们之间转换(segue)的其他信息。因此,如果我们只讨论单个视图控制器,那么视图控制器的生命周期不应完全不同。

如果不了解视图控制器及其视图层次结构的设置方式,则很难回答您的具体问题。听起来您在滚动视图中有一个视图,并且您想知道何时可以访问其frame属性。

UIKit遵循以下步骤(粗略地):

  1. 它加载storyboard / xib文件中描述的所有视图,并根据需要连接所有操作和出口。在此步骤之后调用viewDidLoad
  2. 调用viewWillAppear:表示它即将显示视图。
  3. 它将视图添加到窗口,调整大小以适应。大小调整沿视图层次结构向下传播,因此每个视图都会布置其子视图(如果它配置为自动调整子视图)。这些更改发生在动画块内,因此一旦设置完所有内容,用户就会看到新视图动画到位。
  4. 动画完成后,系统会调用viewDidAppear:
  5. 如果视图autoresizesSubviews设置为NO,您可能会看到一些奇怪的内容;这可能是您必须在layoutIfNeeded上致电self.scroller的原因。请注意,layoutIfNeeded的文档说:

      

    当收到此消息时,将遍历图层的超级图层,直到找到不需要布局的祖先图层。然后在该祖先下面的整个图层树上执行布局。

    因此它可能会触发其他无关视图的布局。