gpt4 book ai didi

ios - 强制自动布局在 viewDidLoad 正确更新 UIView 框架

转载 作者:可可西里 更新时间:2023-10-31 23:58:33 24 4
gpt4 key购买 nike

尽管它可能很简单,但我仍然发现自己在寻找正确的解决方案。

我试图了解在 中找到 REAL UIView(或任何其他 subview )框架的正确方法是什么>viewDidLoad 使用自动布局时。

主要问题是在 viewDidLoad 中, View 没有应用它们的约束。我知道这种情况的“已知”答案是

override func viewDidLoad() {
super.viewDidLoad()
view.layoutIfNeeded()
stepContainer.layoutIfNeeded() // We need this Subview real frame!
let realFrame = stepContainer.frame
}

但我发现它并不总是有效,而且有时它会给出错误的帧(即不是显示的最终帧)。

经过更多研究后,我发现在 DispatchQueue.main.async { } 下扭曲此代码可提供准确的结果。但我不确定这是否是处理该问题的正确方法,或者我是否使用它引起了某种幕后问题。最终的“工作”代码:

override func viewDidLoad() {
super.viewDidLoad()

DispatchQueue.main.async {
self. stepContainer.layoutIfNeeded()
print(self. stepContainer.frame) // Real frame..
}

}

注意:我需要从 viewDidLoad 中找到真正的框架,请不要建议使用 viewDidAppear/layoutSubviews 等。

最佳答案

正如@DavidRönnqvist 指出的那样

The reason dispatch async gives you the "correct" value here is that it get scheduled to run in the next run loop; after viewWillAppear and viewDidLayoutSubviews has run.

示例

override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.main.async {
print("DispatchQueue.main.async viewDidLoad")
}
}

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)

print("viewWillAppear")
}

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)

print("viewDidAppear")
}

override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()

print("viewDidLayoutSubviews")
}

viewWillAppear

viewDidLayoutSubviews

viewDidAppear

DispatchQueue.main.async viewDidLoad

viewDidLoad 中的 DispatchQueue.main.async 中的代码甚至在 viewDidAppear 之后调用。因此,在 viewDidLoad 中使用 DispatchQueue.main.async 可为您提供正确的帧,但它不是尽可能早。

回答

  • 如果您想尽早获得正确的框架,viewDidLayoutSubviews 是正确的地方。

  • 如果您必须viewDidLoad 中放置一些代码,那么您的做法是正确的。看起来 DispatchQueue.main.async 是最好的方法。

关于ios - 强制自动布局在 viewDidLoad 正确更新 UIView 框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46230383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com