Xcode的自动布局仅在viewDidAppear中有效,这是非常有问题的

时间:2012-11-01 14:42:58

标签: objective-c ios xcode

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

例如,有时开发人员需要根据自动布局选择放置特定子视图的位置来调整子视图的信息。开发人员无法确定子视图的最终位置,直到用户已经看到它为止。用户不应该看到这些信息调整,而是一次性显示最终结果。

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

2 个答案:

答案 0 :(得分:6)

作为一般规则,viewDidLoad中永远不应依赖视图框架/边界。

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

您应该始终viewWillAppearviewDidAppear中执行您的视图布局,因为这些方法在视图准备好进行演示后会被调用。

作为测试,如果您在NSLog(@"frame: %@", NSStringFromCGRect(self.view.frame));viewDidLoad方法中只是viewWillAppear,您将看到只有后一种方法返回与任何其他元素相关的实际视图大小缠绕在您的视图上(例如UINavigationBarUITabBar)。

答案 1 :(得分:0)

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

引用他原来的评论

  

我在按下它时让表格视图显示在正确的滚动位置时遇到了麻烦[...]因为直到viewWillAppear之后才发生布局。这意味着在设置正确的大小之前进行滚动计算,结果是关闭的。对我有用的是调用layoutIfNeeded,后跟代码在viewWillAppear中设置滚动位置。