swift 不确定 layoutIfNeeded setNeedsUpdateConstraints 或 updateConstraints setNeedsLayout

Posted

技术标签:

【中文标题】swift 不确定 layoutIfNeeded setNeedsUpdateConstraints 或 updateConstraints setNeedsLayout【英文标题】:swift not sure on layoutIfNeeded setNeedsUpdateConstraints or updateConstraints setNeedsLayout 【发布时间】:2015-07-21 20:22:07 【问题描述】:

我正在调用 API。根据我得到的 json 数据,我在 viewDidLoad() 中修改了我的视图控制器,以便更改我的视图设计以尽可能最好地显示给定数据。

我所做的是隐藏一些 uiViews 并将它们的约束设置为 .active = false ,但还通过以下方式更改一些约束:

let noCButton = NSLayoutConstraint(item: aListTop, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: aListBottom, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0)
        view.addConstraint(noBidButton)

然后就在关闭 viewDidLoad() 之前,我在其中更改/禁用了一些我调用的约束 view.layoutIfNeeded()

所以我现在的问题是,

如果我更改/禁用某些约束或隐藏 uiview,我应该总是在之后调用 view.layoutIfNeeded() 吗?

另外,我是否需要在每次更改后立即调用view.layoutIfNeeded(),还是我可以在关闭 viewDidLoad() 之前简单地调用一次?

无论哪种方式,我的控制台都没有出现任何错误,但我只是想确保我以正确的方式进行操作。我还注意到像 updateConstraints 这样的函数,但 layoutIfNeeded 似乎可以工作,尽管我不是 100% 确定差异

提前致谢,

【问题讨论】:

【参考方案1】:

我会打电话给view.setNeedsUpdateConstraints()。在viewDidLoad() 之后,应该自动调用viewWillLayoutSubviews()。这应该是您此时需要做的所有事情。

如果您需要强制视图立即更新,请调用view.layoutIfNeeded(),如果您想进行一组更改,然后在下一次布局传递中全部应用它们,只需在所有更改结束时调用view.setNeedsLayout() .

【讨论】:

为什么我不能只运行 view.layoutIfNeeded()?它现在不输出任何错误。而且由于我只是在 viewDidLoad 中进行更改后才进行更改 抱歉没有看到您的编辑。好,谢谢!那我就直接在viewDidLoad中调用view.setNeedsLayout()?由于我正在那里进行更改,并且在设置更改之前我不想显示视图 您甚至可能不需要调用 setNeedsLayout,因为无论如何这都会发生在 viewDidLoad 之后。

以上是关于swift 不确定 layoutIfNeeded setNeedsUpdateConstraints 或 updateConstraints setNeedsLayout的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中使用 layoutIfNeeded() 不为特定约束更改设置动画?

layoutIfNeeded 是如何使用的?

最好在更改约束之前或之后调用 .layoutIfNeeded()

IOS Swift 卡片效果图被剪裁了

覆盖 UILabel setText: Swift 中的方法

关于 iOS 约束更新动画 - 动画块 + layoutIfNeeded