当自动布局约束在视图控制器生命周期期间设置帧时



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

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

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

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

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

例如:-

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

希望这有帮助! :)

名思义,viewDidLayoutSubviews是在viewController的视图刚刚完成其布局时调用的,您可以根据自动布局约束假设在该动态高度,您的视图位于正确的位置/框架中。

Swift :
    override func viewDidLayoutSubviews() {
       // Set your constraint here
    }
Objective C :
   -(void)viewDidLayoutSubviews {
   // Set your constraint here
   }

我不确定你实际上想在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()
    }

最新更新