我听说当我们使用约束时viewDidLayoutSubviews
是改变布局的最佳位置。
所以我跳到viewDidLayoutSubviews
我在SuperView上创建了三个UIViews
和SubViewed
个。我没有提到帧计算的代码。
[self.view addSubview:imgMiddleCircle];
[self.view addSubview:imgFirstCircle];
[self.view addSubview:imgLastCircle];
使用这部分我将添加这些圈子。
现在当我在viewDidLayoutSubviews
中运行我的代码时,我会看到以下屏幕:
当我切换到viewWillLayoutSubviews
时,我会在屏幕上显示:
为什么我在viewDidLayoutSubviews
中获得额外的两个圈子,即使我创建了三个圈子。
为什么viewWillLayout
会给出正确的输出。
答案 0 :(得分:3)
您应该为viewDidLayoutSubviews
被称为多种类型的事实进行编码。
理想情况下,addSubview:
应该在viewDidLoad
之类的地方进行,您确定它只会被调用一次。
您可以创建一个标志,以避免调用addSubview:
倍数类型(不是我个人选择)
否则,尝试将您的设置代码移至viewDidLoad
并强制视图在进行计算前自行渲染:
[yourView setNeedsLayout];
[yourView layoutIfNeeded];
答案 1 :(得分:2)
当视图控制器视图的边界发生变化时,视图 调整其子视图的位置,然后系统调用它 方法。但是,调用此方法并不表示该方法 已调整视图子视图的各个布局。每 subview负责调整自己的布局。
您的视图控制器可以覆盖此方法以进行更改 该视图列出了其子视图。这个的默认实现 方法什么都不做。
因此,基本上,在创建viewController期间会多次调用viewDidLayoutSubiews
,包括旋转设备,滚动等等。因此,您应该非常小心添加到此方法中的代码,因为它也可能被执行多次。 使用此方法重新定位子视图,而不是添加/删除它们。
请查看此blog了解详情。