1

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

所以我跳到viewDidLayoutSubviews

我在 SuperView 上UIViews创建了三个。SubViewed我没有提到框架计算的代码。

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

使用这块我正在添加这些圆圈。

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

在此处输入图像描述

当我切换到时,viewWillLayoutSubviews我会在屏幕上看到这个:

在此处输入图像描述

为什么viewDidLayoutSubviews即使我正在创建三个圆圈,我也会得到额外的两个圆圈。

以及为什么 inviewWillLayout给出正确的输出。

4

2 回答 2

3

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

理想情况下addSubview:,应该发生在viewDidLoad您确定它只被调用一次的地方。

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

否则,请尝试将您的设置代码移动到viewDidLoad并强制视图在进行计算之前呈现自身:

[yourView setNeedsLayout];

[yourView layoutIfNeeded];

于 2015-10-15T10:14:57.817 回答
2

根据Apple 文档

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

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

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

请查看此博客以获取更多详细信息。

于 2015-10-15T10:12:55.797 回答