自动布局不会在 iOS 8-Xcode 6 中立即更新帧

Posted

技术标签:

【中文标题】自动布局不会在 iOS 8-Xcode 6 中立即更新帧【英文标题】:Autolayout is not updating frames instantly in iOS8-Xcode6 【发布时间】:2014-10-09 09:38:03 【问题描述】:

我在XCode6 中使用autolayout

我已将以下约束应用于scrollview

我尝试在 iPhone 4Inchs 设备的 -viewDidLoad 和 -viewWillAppear 方法中访问此滚动视图的框架。这里的问题是,滚动视图的宽度在日志中显示为 600。但是在我使用autolayout 时,4Ichs 设备中的宽度应该是 300。 似乎autolayout 将在一段时间后应用。它在 -viewDidAppear 方法中显示正确的宽度为 300。

有没有办法在 -viewDidLoad 和 -viewWillAppear 方法中访问原始帧?

提前致谢。

【问题讨论】:

这里没有问题。宽度是指在界面生成器中计算的宽度,而不是在预览屏幕中。在模拟器或设备上运行它。只要您正确设置约束就可以了。 【参考方案1】:

在布局传递发生之前,自动布局不会为您提供“正确”的帧大小。 viewDidLoad 为时过早,而我的脑海中 willAppear 可能也太早了。 viewDidLayoutSubviews 是正确的地方。

【讨论】:

【参考方案2】:

将此代码放在您的 viewDidLoad() 中

self.view.setNeedsLayout();
self.view.layoutIfNeeded();

在访问scorllView.frame.size.width之前

【讨论】:

在-viewDidLoad方法-setNeedsLayout,-layoutIfNeeded之后观察到scorllView的帧,但是没有传递scorllView的最后一帧。 -viewDidLayoutSubviews 是我找到的解决方案。但是在 -viewDidLayoutSubviews 中获取原始帧并基于更新 UI 很烦人。我希望应该有更好的解决方案。 @AshokKumarS 我今天尝试了这两种方法来获取 UITextField 的更新框架。我在 viewWillAppear 中得到了框架。它给出了正确的框架。 由于某种原因,我没有得到原始帧(但我在共享扩展中测试了它,而不是在主应用程序中)。但没关系,我正在使用 -viewDidLayoutSubviews 方法。如果我们在 -viewDidLoad 或 -viewWillAppear 中显式添加 -setNeedsLayout、-layoutIfNeeded 是否会影响性能(即使是一点点也是额外的成本)?【参考方案3】:

从 viewDidLoad 和 viewWillAppear 来看,它的显示与界面构建器的尺寸相同。如果您的应用程序在 scrollView 框架上中继(如果您希望在 viewDidAppear 之前使用它们)在呈现之前调用 viewController 实例 view 方法。

UIViewController *myVC = [[UIViewController alloc]init];
[myVC view]
[self.navigationController pushViewController:myVC];

但这取决于应用程序的性能。

【讨论】:

以上是关于自动布局不会在 iOS 8-Xcode 6 中立即更新帧的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 Xcode 6:使用顶部/底部布局指南进行顶部/底部约束时,应用程序始终崩溃

UITableView 布局在 push segue 和 return 上搞砸了。 (iOS 8、Xcode beta 5、Swift)

iOS:自动布局的问题。模拟器结果更改为故事板更改

UIPopoverController 在 iOS 8 / Xcode 6 中没有关闭

在 iOS 6 中启用自动布局,在 < iOS6 中禁用自动布局

在 IOS 8、Xcode 6 中插入 UISearchBar [关闭]