【发布时间】:2018-02-24 02:29:21
【问题描述】:
尽管它可能很简单,但我仍然发现自己在努力寻找正确的解决方案。
我试图了解在 viewDidLoad 使用自动布局时。
主要问题是在 viewDidLoad 中,视图没有应用它们的约束。我知道这种情况的“已知”答案是
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 等。
【问题讨论】:
-
viewDidLoad 不是设置需要框架知识的东西的地方,这就是您遇到此问题的原因
-
@trapper 我知道这一点。由于特定情况,我需要解决这个问题(并且可以解决)。我只是确保我以正确的方式解决了它
-
在视图生命周期的早期,你试图用框架做什么?
-
@DavidRönnqvist 我需要预加载一些依赖于子视图框架的 CIImages。我需要尽早预加载它们,以便为用户提供最佳体验(他可能会立即使用它们)
-
另外,dispatch async 在这里为您提供“正确”值的唯一原因是它被安排在下一个运行循环中运行; 之后
viewWillAppear和viewDidLayoutSubviews已经运行。时间发生了变化,但不如将相同的代码放在这两种方法中的稳健方式(因为它依赖于时间 - 如果视图已加载但未添加为子视图,则情况并非如此) )
标签: ios swift uiview autolayout viewdidload