当自动布局约束在视图控制器生命周期中设置框架时?

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中这样做。但这并不总是有帮助,因为视图绘制可能并不总是在此时完成。所以更好的选择是将代码放在 viewWillLayoutSubviewsviewDidLayoutSubviews.

注意: viewWillLayoutSubviewsviewDidLayoutSubviews 将在视图的生命周期中被多次调用,例如方向改变或移入和移出另一个视图或与此相关的任何框架更改。
如果您想在这里进行的代码更改是一次性事件,那么请确保使用标志。

例如:-

- (void)viewWillLayoutSubviews {    
    if(firstTime) {
        // put your constraint change code here.
    }
}

希望对您有所帮助! :)