【问题标题】:how to properly set subview constraints during initialization?如何在初始化期间正确设置子视图约束?
【发布时间】:2023-03-05 13:21:01
【问题描述】:

我知道如何设置约束,但我真的需要知道如何正确设置它。

基本上我有一个自定义视图子类化 UIView,我需要指定约束,例如标签需要始终位于按钮上方 10pts。

像这样的约束,我在哪里设置呢?现在我在init 函数中设置约束,在指定约束后我调用layoutIfNeeded。但我也读到你应该在layoutSubviews 中设置约束,但是我又在某处读到layoutSubviews 会被调用很多次,所以在那里设置约束并没有什么意义。

我也玩过一些布局子视图,我意识到我在布局子视图中设置的约束对布局根本没有任何影响。到目前为止,我只通过直接调用 layoutIfNeeded 成功设置了约束。

我也很好奇,我需要设置约束一次还是每次刷新一次?

我这样做对吗?我应该在自定义类中的哪里设置约束?

【问题讨论】:

    标签: swift layout uiview constraints


    【解决方案1】:

    每次刷新时设置约束(例如在 LayoutSubviews 中)会搅动约束并导致大量不必要的工作。有一个很棒的 WWDC 讨论,高性能自动布局。

    https://developer.apple.com/videos/play/wwdc2018/220

    但总的来说,使用 Interface Builder 会让您摆脱困境;也就是说,系统会在视图生命周期的适当时间处理添加约束。

    如果您必须以编程方式添加约束,那么在初始化程序中添加它们并调用 layoutIfNeeded() 是一个很好的解决方案。

    【讨论】:

    • 所以我应该在设置约束时立即更新视图?
    • 在 init() 中设置约束意味着布局更新处于等待状态。 layoutIfNeeded() 将强制布局引擎立即更新其布局。是的,我会在设置约束后立即调用 layoutIfNeeded。
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多