iOS 8顶级布局指导自动布局问题

Dav*_*ter 23 iphone ios autolayout ios8

我的应用程序中的一个屏幕在更新到iOS 8 SDK时完全破坏了.问题似乎是顶部布局指南向上移动而不是其他视图的"锚点".

这就是iOS 7上的视图:

iOS 7屏幕

这就是它在iOS 8中的样子(从Xcode 6 View Hierarchy调试器中捕获):

iOS 7屏幕

如您所见,视图显示在导航栏上方.顶部布局指南有两个约束,一个用于上部图像视图,另一个用于下面的白色视图.底部布局指南没有约束,只有视图的高度限制.

出于某种原因,iOS 8决定将顶部布局指南推送到{0 -255; 0 0}after,这[self.view layoutIfNeeded]是第一次调用.此外,视图的边界有时对于设备来说太大(即,与统一故事板(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]>
)
Run Code Online (Sandbox Code Playgroud)

Bla*_*cky 43

Extend Edges > Under Top Bars 默认情况下,在"属性"检查器的"扩展边"部分中选中.

尝试取消选中Under Top Bars.

当我遇到像这样的奇怪行为时,这对我有很多帮助.

请注意它是一个UIViewController属性,因此如果您愿意,可以在代码中设置它.

在Interface Builder中的Top Bars选项下


Mru*_*nal 5

你可以使用UIBarPositionTopAttached或者你可以使用视图边界和框架,我也可以建议并链接到Apple的文档,这需要一些时间来解决问题.

解决此问题的最佳和最简单的方法是将视图控制器嵌入到导航控制器中,就是这样.您只需选择视图控制器并转到编辑器>嵌入>导航控制器即可完成此操作.(如果旧导航栏上有任何内容,您可以先将其向下拖动,将视图控制器嵌入导航控制器中,然后移动新导航栏上的栏按钮,然后删除旧的导航栏)

要么

将导航栏的translucent属性设置为NO:

self.navigationController.navigationBar.translucent = NO;
Run Code Online (Sandbox Code Playgroud)

这将修复视图在导航栏和状态栏下面的框架.

如果您必须显示和隐藏导航栏,请使用

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
Run Code Online (Sandbox Code Playgroud)

在你的viewDidLoad方法.

希望其中任何一个都能解决您的问题.


Jak*_*keP 5

我正在使用Xcode 6.3.1,似乎这个版本的bug又回来了(假设它已经在5.1中修复).我无法在SO上找到解决办法,所以我不得不谷歌更多,这里是:

而不是在IB中进行常规的Ctrl +拖动,只需选择要执行此操作的视图,然后转到编辑器 - > Pin - > Top Space to Superview.

这是来源:LINK 在我的案例中有所帮助.


Nik*_*nko 2

也有这样的问题。如果仅在 iOS8 上运行,您可以将约束从“topLayoutGuide.bottom-myView.top”更改为“topLayoutGuide.top-myView.top”。但这会破坏 iOS7 的 UI。可以在代码中编写类似的解决方法来支持这两个版本,但是在故事板中创建 UI 时,没有机会使 UI 对于这两个版本都能正常工作。