自动布局不会在 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)
UIPopoverController 在 iOS 8 / Xcode 6 中没有关闭