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