[英]iOS 8 top layout guide auto layout problems
我的应用程序中的一个屏幕在更新到iOS 8 SDK时完全破坏了。 问题似乎是顶部布局指南向上移动而不是其他视图的“锚点”。
这就是iOS 7上的视图:
这就是它在iOS 8中的样子(从Xcode 6 View Hierarchy调试器中捕获):
如您所见,视图显示在导航栏上方。 顶部布局指南有两个约束,一个用于上部图像视图,另一个用于下面的白色视图。 底部布局指南没有约束,只有视图的高度限制。
出于某种原因,iOS 8决定将顶部布局指南推到{0 -255; 0 0}
第一次调用[self.view layoutIfNeeded]
后{0 -255; 0 0}
。 此外,视图的边界有时对于设备来说太大(即,与统一故事板(600x600)完全一样,而不是320x480 / 320x568)。
iOS 8中发生了哪些变化可能会破坏布局?
[编辑]以下是视图约束的完整列表:
(lldb) po self.view.constraints
<__NSArrayM 0x786ac520>(
<NSLayoutConstraint:0x7c377bd0 V:[_UILayoutGuide:0x7c372f60]-(0)-[UIView:0x7c373120]>,
<NSLayoutConstraint:0x7c377c00 UIView:0x7c373120.width == UIView:0x7c3730b0.width>,
<NSLayoutConstraint:0x7c377c30 UIView:0x7c3730b0.centerX == UIView:0x7c373120.centerX>,
<NSLayoutConstraint:0x7c377c60 H:|-(0)-[UIView:0x7c3716f0] (Names: '|':UIView:0x7c3730b0 )>,
<NSLayoutConstraint:0x7c377c90 UIView:0x7c3716f0.width == UIView:0x7c3730b0.width>,
<NSLayoutConstraint:0x7c372f30 V:[_UILayoutGuide:0x7c372f60]-(129)-[UIView:0x7c3716f0]>
)
默认情况下,在“属性”检查器的“延伸边缘”部分中选中“ Extend Edges > Under Top Bars
。
尝试取消选中Under Top Bars
。
当我遇到像这样的奇怪行为时,这对我有很多帮助。
请注意它是一个UIViewController属性,因此如果您愿意,可以在代码中设置它。
您既可以使用UIBarPositionTopAttached
,也可以使用视图边界和框架,我也可以建议并链接到您需要一些时间来解决问题的Apple文档 。
解决此问题的最佳和最简单的方法是将视图控制器嵌入到导航控制器中,就是这样。 您只需选择视图控制器并转到编辑器>嵌入>导航控制器即可。 (如果旧导航栏上有任何内容,您可以先将其向下拖动,将视图控制器嵌入导航控制器中,然后移动新导航栏上的栏按钮,然后删除旧的导航栏)
要么
将导航栏的translucent
属性设置为NO
:
self.navigationController.navigationBar.translucent = NO;
这将修复视图在导航栏和状态栏下面的框架。
如果您必须显示和隐藏导航栏,请使用
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone; // iOS 7 specific
在viewDidLoad
方法中。
希望其中任何一个都能解决您的问题。
我正在使用Xcode 6.3.1,似乎这个版本的bug又回来了(假设它已经在5.1中修复)。 我无法在SO上找到解决办法,所以我不得不谷歌更多,这里是:
而不是在IB中进行常规的Ctrl +拖动,只需选择要执行此操作的视图,然后转到编辑器 - > Pin - > Top Space to Superview。
这是来源: LINK在我的案例中有所帮助。
也有这样的问题。 如果仅在iOS8上运行,则可以将约束从“topLayoutGuide.bottom-myView.top”更改为“topLayoutGuide.top-myView.top”。 但这将打破iOS7的UI。 可以在代码中编写类似的解决方法来支持这两个版本,但是在故事板中创建UI时,没有机会使两个版本的UI运行良好。
您应该为界面构建器保留一个设备分辨率,然后在IB中布局屏幕,而不是使用统一的故事板(600x600)。
如果您的视图控制器的大小在故事板中是600x600,那么在viewDidLoad中,它将为视图控制器的视图获取该帧,并相应地布局子视图。
希望这可以帮助..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.