当自动布局约束在视图控制器生命周期中设置框架时?
When the autolayout constraints set frames during view controller life cycle?
我使用了情节提要中的自动布局约束。但是在某些情况下,我想计算子视图的动态高度。我在 viewDidAppear() 中对此进行编码,它工作正常,因为在布局约束设置所有视图框架之后调用此方法。这里的问题是我半秒能看到constraints设置的frame。然后代码重构视图。
我开始了解 viewDidLayout(),它在约束设置框架后调用,以便我可以更改。但它不起作用。就像在使用约束之前调用此方法。
我不确定您在 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()
}
顾名思义,当您的 viewController 视图刚刚完成布局时调用 viewDidLayoutSubviews 并且您可以假设在该动态高度上您的视图处于正确的 places/frames你的自动布局约束。
Swift :
override func viewDidLayoutSubviews() {
// Set your constraint here
}
Objective C :
-(void)viewDidLayoutSubviews {
// Set your constraint here
}
viewDidAppear
方法在视图生命周期结束时调用。因此,如果您更改此处的约束,它将始终可见。
如果你想做的改变是一次性的,那么你可以在方法viewWillAppear
中这样做。但这并不总是有帮助,因为视图绘制可能并不总是在此时完成。所以更好的选择是将代码放在 viewWillLayoutSubviews
或 viewDidLayoutSubviews
.
注意: viewWillLayoutSubviews
或 viewDidLayoutSubviews
将在视图的生命周期中被多次调用,例如方向改变或移入和移出另一个视图或与此相关的任何框架更改。
如果您想在这里进行的代码更改是一次性事件,那么请确保使用标志。
例如:-
- (void)viewWillLayoutSubviews {
if(firstTime) {
// put your constraint change code here.
}
}
希望对您有所帮助! :)
我使用了情节提要中的自动布局约束。但是在某些情况下,我想计算子视图的动态高度。我在 viewDidAppear() 中对此进行编码,它工作正常,因为在布局约束设置所有视图框架之后调用此方法。这里的问题是我半秒能看到constraints设置的frame。然后代码重构视图。
我开始了解 viewDidLayout(),它在约束设置框架后调用,以便我可以更改。但它不起作用。就像在使用约束之前调用此方法。
我不确定您在 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()
}
顾名思义,当您的 viewController 视图刚刚完成布局时调用 viewDidLayoutSubviews 并且您可以假设在该动态高度上您的视图处于正确的 places/frames你的自动布局约束。
Swift :
override func viewDidLayoutSubviews() {
// Set your constraint here
}
Objective C :
-(void)viewDidLayoutSubviews {
// Set your constraint here
}
viewDidAppear
方法在视图生命周期结束时调用。因此,如果您更改此处的约束,它将始终可见。
如果你想做的改变是一次性的,那么你可以在方法viewWillAppear
中这样做。但这并不总是有帮助,因为视图绘制可能并不总是在此时完成。所以更好的选择是将代码放在 viewWillLayoutSubviews
或 viewDidLayoutSubviews
.
注意: viewWillLayoutSubviews
或 viewDidLayoutSubviews
将在视图的生命周期中被多次调用,例如方向改变或移入和移出另一个视图或与此相关的任何框架更改。
如果您想在这里进行的代码更改是一次性事件,那么请确保使用标志。
例如:-
- (void)viewWillLayoutSubviews {
if(firstTime) {
// put your constraint change code here.
}
}
希望对您有所帮助! :)