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

Pau*_*Goh 10 xcode objective-c ios

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

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

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

Cap*_*uff 6

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

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

你应该总是做你的视图布局在任一viewWillAppearviewDidAppear因为一旦视图已经为准备演讲调用这些方法.

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

  • 当将表格视图推送到导航堆栈时(在iOS 7上,由于某种原因而不是6),我无法使表格视图显示在正确的滚动位置,因为直到`viewWillAppear`之后才发生布局.这意味着在设置正确的大小之前进行滚动计算,结果是关闭的.对我有用的是调用`layoutIfNeeded`后跟代码来设置`viewWillAppear`中的滚动位置.在没有跳转到用户可见的滚动位置的情况下,在`viewDidLayoutSubviews`,`viewWillLayoutSubviews`或`viewDidAppear`中设置滚动位置不起作用. (10认同)
  • 我遇到的问题是viewWillAppear:中没有显示视图,也没有在updateViewConstraints和viewDidLayoutSubviews之后 - 仅在viewDidAppear中:视图布局(子视图的框架不是CGRectZero) - 然后它是在没有用户看到更改的情况下编辑视图太晚了. (7认同)