需要有关viewDidLayoutSubviews的帮助

时间:2015-09-20 11:41:18

标签: ios objective-c uiview autolayout calayer

关于viewDidLayoutSubviews的Apple文档说:

  

当视图控制器视图的边界发生变化时,视图   调整其子视图的位置,然后系统调用它   方法。但是,调用此方法并不表示该方法   视图的子视图的各个布局已经过调整。每个   subview负责调整自己的布局。

     

您的视图控制器可以覆盖此方法,以便在视图布局其子视图后进行更改。此默认实现   方法什么都不做。

我的view1包含view2,表示view2view1的子视图。我正在为CALayer创建一个view2,我希望其大小为view2。我正在使用auto layouts,因此我想在CALayer完成其工作时创建auto layout,以便为CALayer框架设置正确的值。

但在viewDidLayoutSubviews方法中,我无法检测到view2确切auto layout帧的设置时间,因为Apple doc也在说

  

此方法被调用并不表示个人   视图的子视图的布局已经过调整。

之后,Apple医生说

  

您的视图控制器可以覆盖此方法以进行更改   该视图列出了其子视图。

我很困惑auto layout将设置view2框架,以便我可以相应地设置我的CALayer框架。

1 个答案:

答案 0 :(得分:2)

正如我在评论中提到的,如果您的视图与自动布局一致,则不必执行任何特殊操作。如果您希望单个图层调整其到视图边界的边界,最简单和正确的方法将是覆盖视图的layerClass方法 - 在这种情况下,图层边界将在视图中自动调整。如果除了标准图层之外还需要一个图层,更新图层边界的最佳位置可能是setFrame:方法覆盖。

viewDidLayoutSubviews开始,只是一个通知您的事件,即viewcontroller的根视图的所有子视图都位于所需的位置。您无法保证这些子视图的所有其余子视图也将对齐,因为它是父视图本身的责任。它们可以是自动布局定位和手动布局定位。此事件也不保证所有视图都按需显示,尤其是当它们的帧更改已设置动画时。