上述答案都没有对我完全有效,除了viewDidLoad
它的副作用是直到视图动画后才显示我想要的内容,这看起来很糟糕。
viewDidLayoutSubviews
应该是运行依赖于完整自动布局的代码的正确位置,但正如其他人指出的那样,它在最近的 iOS 版本中被多次调用,你不知道哪个是最终调用。
所以我用一个小技巧解决了这个问题。在我的故事板中,mySubview
应该小于其包含的self.view
. 但是viewDidLayoutSubviews
第一次调用时,mySubview
宽度仍然为 600,而self.view
似乎设置正确(这是一个 iPhone 项目)。所以我所要做的就是监控后续调用并检查相对宽度。一旦mySubview
小于self.view
我可以确定它已正确布局。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if self.mySubview.bounds.size.width < self.view.bounds.size.width {
// mySubview's width became less than the view's width, so it is
// safe to assume it is now laid out correctly...
}
}
这具有不依赖硬编码数字的优势,因此它可以在所有 iPhone 外形尺寸上工作,例如。当然,它可能不是所有情况下或所有设备上的灵丹妙药,但可能有许多巧妙的方法可以对相对大小进行类似的检查。
不,我们不应该这样做,但是在 Apple 给我们一些更可靠的回调之前,我们都会坚持下去。