当autolayout约束在视图控制器生命周期中设置帧时?

时间:2016-03-21 07:17:41

标签: ios objective-c xcode ios-autolayout

我在故事板中使用过autolayout约束。但是在某些情况下,我想计算子视图的动态高度。我在viewDidAppear()中编码,它工作正常,因为在布局约束设置所有视图框架之后调用此方法。这里的问题是我可以通过约束看到框架设置半秒钟。然后代码重新构建视图。

我开始了解viewDidLayout(),它在约束设置框架后调用,以便我可以更改。但它不起作用。就像在使用约束之前调用此方法一样。

3 个答案:

答案 0 :(得分:11)

在视图生命周期结束时调用viewDidAppear方法。因此,如果您在此处更改约束,它将始终可见。

如果您要进行的更改是一次性事件,则可以使用方法viewWillAppear执行此操作。但这并不总是有用,因为此时可能并不总是完成视图绘制。因此,更好的选择是将代码放在viewWillLayoutSubviewsviewDidLayoutSubviews

注意: viewWillLayoutSubviewsviewDidLayoutSubviews将在视图的生命周期中多次调用,例如方向更改或移入和移出另一个视图或任何帧更改对于这个问题。
如果您想要放置的代码更改是一次性事件,请确保使用标记。

例如: -

- (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()
    }