Objective c Xcode';的自动布局仅在ViewDidDisplay中有效,这是非常有问题的

Objective c Xcode';的自动布局仅在ViewDidDisplay中有效,这是非常有问题的,objective-c,ios,xcode,Objective C,Ios,Xcode,在将我的项目升级到iOS 6之后,我意识到自动布局只在ViewDidDisplay中有效,我的大多数代码都希望视图的框架在viewDidLoad中可用。这个限制使得非常好的自动布局功能对我来说几乎毫无用处。有什么建议可以帮助我使用自动布局吗 例如,有时开发人员需要根据auto layout选择放置特定子视图的位置来调整有关子视图的信息。在用户已经看到子视图之前,开发人员无法确定子视图的最终位置。用户不应看到这些信息调整,而应立即显示最终结果 更具体地说:如果我想根据“自动布局”放置视图的位置更改

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

例如,有时开发人员需要根据auto layout选择放置特定子视图的位置来调整有关子视图的信息。在用户已经看到子视图之前,开发人员无法确定子视图的最终位置。用户不应看到这些信息调整,而应立即显示最终结果


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

一般来说,在
viewDidLoad
中不应依赖视图帧/边界

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

您应该始终在
viewwillbeen
viewdidebeen
中进行视图布局,因为一旦视图准备好进行演示,就会调用这些方法


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

如@charshep在注释中所述,调用视图中的
view.layoutifneedd()
可以实现这一目的

引用他最初的评论


当按下表格视图时,我很难让它显示在正确的滚动位置[…],因为直到视图出现之后,才出现布局。这意味着滚动计算是在设置正确的大小之前进行的,因此结果是关闭的。对我有效的方法是调用layoutIfNeeded,然后调用代码来设置ViewWillDisplay中的滚动位置


我遇到的问题是,视图没有在ViewWillDisplay中布局,updateViewConstraints之后,ViewDidLayoutSubview-仅在ViewDidDisplay中:视图布局(子视图的框架不是CGRectZero)-到那时,在用户看不到更改的情况下编辑视图为时已晚。如果没有看到您的代码,我只能假设您实现了一些错误的东西,因为在调用
viewdilayoutsubviews
时,任何子视图都应该就位。用一些代码更新您的问题,以便人们能够解释可能出现的问题。从我所看到的
viewdilayoutsubviews
经常被多次调用,这只是最后一次可以依赖。当将表视图推到导航堆栈上时,我很难让它显示在正确的滚动位置(由于某些原因,在iOS 7上,而不是在iOS 6上)因为布局是在
视图出现之后才出现的。这意味着滚动计算是在设置正确的大小之前进行的,因此结果是关闭的。对我来说,有效的方法是调用
layoutIfNeeded
,然后调用在
视图中设置滚动位置的代码将出现
。在中设置滚动位置ode>viewDidLayoutSubviews
viewWillLayoutSubviews
viewDidAppear
如果没有跳转到用户可见的滚动位置,则无法工作。@charshep-您的注释应该是答案。