我在故事板中使用过autolayout约束。但是在某些情况下,我想计算子视图的动态高度。我在viewDidAppear()中编码,它工作正常,因为在布局约束设置所有视图框架之后调用此方法。这里的问题是我可以通过约束看到框架设置半秒钟。然后代码重新构建视图。
我开始了解viewDidLayout(),它在约束设置框架后调用,以便我可以更改。但它不起作用。就像在使用约束之前调用此方法一样。
答案 0 :(得分:11)
在视图生命周期结束时调用viewDidAppear
方法。因此,如果您在此处更改约束,它将始终可见。
如果您要进行的更改是一次性事件,则可以使用方法viewWillAppear
执行此操作。但这并不总是有用,因为此时可能并不总是完成视图绘制。因此,更好的选择是将代码放在viewWillLayoutSubviews
或viewDidLayoutSubviews
。
注意: viewWillLayoutSubviews
或viewDidLayoutSubviews
将在视图的生命周期中多次调用,例如方向更改或移入和移出另一个视图或任何帧更改对于这个问题。
如果您想要放置的代码更改是一次性事件,请确保使用标记。
例如: -
- (void)viewWillLayoutSubviews {
if(firstTime) {
// put your constraint change code here.
}
}
希望这有帮助! :)
答案 1 :(得分:4)
顾名思义,当viewController的视图刚刚完成布局时,会调用viewDidLayoutSubviews,您可以假设在该动态高度,根据您的自动布局约束,您的视图位于正确的位置/帧中。
Swift :
override func viewDidLayoutSubviews() {
// Set your constraint here
}
Objective C :
-(void)viewDidLayoutSubviews {
// Set your constraint here
}
答案 2 :(得分:0)
我不确定你在viewDidLayoutSubviews()
实际上要做什么。我总是通过修改覆盖此方法的布局约束值来自定义视图。
// Called to notify the view controller that its view has just laid out its subviews
override func viewDidLayoutSubviews() {
//Write your code here, any constraint modification etc.
super.viewDidLayoutSubviews()
}