使用viewDidLayoutSubviews时出现问题

时间:2015-10-15 10:00:23

标签: ios objective-c autolayout layoutsubviews

我听说当我们使用约束时viewDidLayoutSubviews是改变布局的最佳位置。

所以我跳到viewDidLayoutSubviews

我在SuperView上创建了三个UIViewsSubViewed个。我没有提到帧计算的代码。

 [self.view addSubview:imgMiddleCircle];
 [self.view addSubview:imgFirstCircle];
 [self.view addSubview:imgLastCircle]; 

使用这部分我将添加这些圈子。

现在当我在viewDidLayoutSubviews中运行我的代码时,我会看到以下屏幕:

enter image description here

当我切换到viewWillLayoutSubviews时,我会在屏幕上显示:

enter image description here

为什么我在viewDidLayoutSubviews中获得额外的两个圈子,即使我创建了三个圈子。

为什么viewWillLayout会给出正确的输出。

2 个答案:

答案 0 :(得分:3)

您应该为viewDidLayoutSubviews被称为多种类型的事实进行编码。

理想情况下,addSubview:应该在viewDidLoad之类的地方进行,您确定它只会被调用一次。

您可以创建一个标志,以避免调用addSubview:倍数类型(不是我个人选择)

否则,尝试将您的设置代码移至viewDidLoad并强制视图在进行计算前自行渲染:

  

[yourView setNeedsLayout];

     

[yourView layoutIfNeeded];

答案 1 :(得分:2)

Apple Documentation

  

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

     

您的视图控制器可以覆盖此方法以进行更改   该视图列出了其子视图。这个的默认实现   方法什么都不做。

因此,基本上,在创建viewController期间会多次调用viewDidLayoutSubiews,包括旋转设备,滚动等等。因此,您应该非常小心添加到此方法中的代码,因为它也可能被执行多次。 使用此方法重新定位子视图,而不是添加/删除它们。

请查看此blog了解详情。