2

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

视图层次结构的屏幕截图

4

1 回答 1

2

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

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

UIKit 遵循以下步骤(大致):

  1. 它加载 storyboard/xib 文件中描述的所有视图,并根据需要连接所有动作​​和出口。viewDidLoad在这一步之后调用。
  2. 它调用viewWillAppear:以指示它即将显示视图。
  3. 它将视图添加到窗口,调整大小以适合。尺寸调整会沿视图层次结构传播,因此每个视图都会布置其子视图(如果将其配置为自动调整子视图大小)。这些更改发生在动画块内,因此一旦设置好所有内容,用户就会看到新视图动画到位。
  4. 一旦动画完成,viewDidAppear:就会被调用。

如果视图autoresizesSubviews设置为NO;你可能会看到一些奇怪的东西 这可能就是你必须打电话layoutIfNeeded的原因self.scroller。请注意,文档layoutIfNeeded说:

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

所以它可能会触发其他不相关视图的布局。

于 2013-01-11T20:44:01.760 回答