10

将我的项目升级到 iOS 6 后,我意识到自动布局仅在 viewDidAppear 中有效,并且我的大部分代码都希望视图的框架在 viewDidLoad 中可用。这种限制使非常好的自动布局功能对我来说几乎毫无用处。有什么建议可以帮助我使用自动布局吗?

例如,有时开发人员需要根据自动布局选择放置特定子视图的位置来调整有关子视图的信息。在用户已经看到子视图之后,开发人员才能确定子视图的最终位置。用户不应该看到这些信息调整,而是一次看到最终结果。

更具体地说:如果我想根据自动布局放置视图的位置更改视图中的图像怎么办?我无法查询该位置,然后在没有用户看到这种情况发生的情况下更改图像。

4

2 回答 2

6

作为一般规则,视图框架/边界不应依赖于viewDidLoad.

viewDidLoad只有在以编程方式或通过 .nib/.xib 文件创建视图后,才会调用该方法。此时,视图尚未设置,仅加载到内存中。

您应该始终在其中一个中进行视图布局,或者viewWillAppearviewDidAppear视图准备好呈现后调用这些方法。

作为测试,如果您NSLog(@"frame: %@", NSStringFromCGRect(self.view.frame));同时使用viewDidLoadviewWillAppear方法,您将看到只有后一种方法返回与包裹在您的视图周围的任何其他元素(例如UINavigationBarUITabBar)相关的实际视图大小。

于 2012-11-01T14:48:25.510 回答
0

正如@charshep 在评论中所说,调用view.layoutIfNeeded()viewWillAppear 可以解决问题。

引用他的原始评论

我在推动表格视图时无法在正确的滚动位置出现 [...],因为布局直到 viewWillAppear 之后才发生。这意味着滚动计算是在设置正确大小之前发生的,因此结果是关闭的。对我有用的是调用 layoutIfNeeded,然后调用代码来设置 viewWillAppear 中的滚动位置。

于 2016-02-09T10:37:01.380 回答