界面生成器:什么是UIView的布局iOS 6/7增量?

我只注意到UIView结构布局下的iOS 6/7 Delta属性。

这是什么,为什么这是从AutoLayout失踪?

在这里输入图像描述

这实际上是指从iOS6到iOS7的布局位置之间的Delta。

在iOS7中,一些视图可以隐藏状态栏或使其处于透明状态,实际上,它将覆盖在视图顶部。 所以如果你在iOS6上把UI元素放在(0.0,0.0)上,它会出现在状态栏的下面,但是在iOS7上它会出现在状态栏的下方。 所以在这种情况下,您需要一个与状态栏高度(20.0分)相匹配的增量,以便iOS6和iOS7中的布局看起来相同。

如果你使用autolayout,我相信这是不需要的,但是当然,那么你失去了iPad1的支持,在这个时候我们很多人都不愿意承认。

注意:前一段我注意到了这个问题,但是现在我只是发布我的答案,因为NDA已经被解除了

为什么不出现AutoLayout?

正如您可能已经注意到的那样,iOS 7带来了全新的外观。 界面元素的外观已经改变,但也有一些尺寸(或一般的指标)。 这可以使界面devise兼容iOS 7和它的前辈有点痛苦。

苹果的官方线是使用AutoLayout来解决这个问题; 这应该会为您布置UI元素带来很多麻烦。 有时候把它们合并是不容易的,特别是如果你仍然需要为了商业目的而支持iOS 5,或者你的界面是以一种使AutoLayout实现困难的方式进行pipe理的。 因此,苹果似乎已经提供了一种方法,让你的工作更容易,如果你陷入这个利基类别,他们已经把这个iOS 6/7三angular洲称为。

那好吧,它是做什么的?

虽然界面生成器中的标签有点不清楚,在这种情况下,“Delta”意味着什么,与.xib文件中包含的代码相对应,这个特性更清晰一些:

<inset key="insetFor6xAndEarlier" minX="-50" minY="-100" maxX="-50" maxY="300"/>

密钥名称insetFor6xAndEarlier明确指出了这一点; 您可以在iOS 7的前身上运行时为UI元素提供替代插页。 例如,上面定义了以下增量变化:

 x: 50 y: 100 width: -100 height: 200 

虽然存储在.xib中的值不直接对应于引用的值,但它们之间存在相关性。

 x: -minX y: -minY width: minX + maxX height: minY + maxY 

下面的图片直观地显示了这种变化。 这是一个极端的例子,但它是展示它的能力。 我只希望在实践中只有几个像素的增量变化。

iOS7视图

iOS6视图

您可能会注意到,这些值与iOS 6视图相反; 这是因为三angular洲相对于你正在使用的视图的types。 如果您正在编辑iOS 6,那么为了正确地为iOS 7转换元素(上述示例的反面),需要增加variables。

为了查看不同的样式,你可以根据它所运行的操作系统改变Interface Builder的显示方式。 这包含在“文件检查器” – >“接口生成器文档”(右侧第一个选项卡)中,如下所示:

接口样式开关

这是否存在,如果我喜欢手动编码我的接口?

不是直接的,但是通过在代码中对操作系统版本进行条件检查,并相应地设置正确的位置/大小,可以轻松达到相同的效果。 在Interface Builder中存在delta能力,因为没有代码就没有直接的条件定位方法,而Interface Builder的目的是尽可能地为UI获得尽可能多的代码。

总体…

苹果强烈build议您使用AutoLayout,它在大多数情况下使您的生活更轻松。 如果你不能使用它(出于上面提到的原因),deltas可以根据当前操作系统的指标,灵活地定位你的UI元素,而不需要手动将它们重新定位到代码中。 一个很好的例子就是对缺less状态栏进行调整,但是还有很多其他的用例。

当然,如果你只是开发iOS7及以上版本,你不需要知道这个function/不会发现它。 只有在使用iOS7 SDK构build应用程序时,如果您需要使用iOS6设备来运行应用程序,而无需自动布局,那么您是否需要增量?

在撰写本文时(8月21日),我无法find任何关于此function的文档,也没有在WWDC资料中提到任何文档。 我玩过一些游戏,经过一番研究,这就是我发现的。

我知道这已经被回答了,只是添加一个小的变体希望它可以帮助那些不使用自动布局,仍然想要支持iOS 6.1和更早版本的人。

阅读此Apple的转换指南 – 支持较早的版本

select“查看为”到“iOS 7.0及更高版本”

在这里输入图像描述

iOS 7的基础用户界面。对于iOS 6,提供合适的增量值。 使用预览来查看这将如何在iOS 7和iOS 6设备中呈现。

在这里输入图像描述

快速步骤:

分别select每个根视图的直接子元素,并将20px添加到其“Y”值。

在这里输入图像描述

然后,集体select所有直接的孩子,并将delta Y设置为-20px。 您也可以批量或单独进行此操作。

在这里输入图像描述

AutoLayout至less需要iOS 6.0。 如果你想支持iOS 5.0,你不能使用AutoLayout。

这些三angular洲是用来帮助你调整在不同的iOS版本(主要是iOS 7和iOS版本低于7)的视图位置。

我用这些价值来帮助我喜欢这张照片。 在这里输入图像描述

要查看iOS 6/7 Delta的操作,我将演示一个在iOS 6和iOS 7设备上正确显示的SegmentedControl。

首先,在Storyboard中select您的.Xib或ViewController。 取消选中使用Autolayout并select“ View as iOS 7 and later

在这里输入图像描述

在Interface Buildercanvas中,放置SegmentedControl,使其origin.y为20.在iOS 6/7 Delta中, 为DeltaYselect-20

在这里输入图像描述

这将使您的SegmentedControl在iOS 6和iOS 7设备的状态栏下方

在这里输入图像描述在这里输入图像描述

从开发人员指南到iOS 7状态栏的另一个有用的引用

可以为每个视图单独设置Deltas,并按预期工作。 如果您的故事板或笔尖被设置为查看iOS 6,那么在iOS 7中运行时,设置变化量将导致该视图被移动和/或调整设置的变化量。或者,如果您的故事板或笔尖被设置为查看在iOS 7中,那么在iOS 6中运行时将会应用这些增量

如果您使用的是AutoLayout,则Delta不可用。 试试这个(在运行iOS6的iPhone 4s中testing):

 - (void) viewWillLayoutSubviews { //iOS 6 workaround offset if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) { self.view.clipsToBounds = YES; CGRect screenRect = [[UIScreen mainScreen] bounds]; CGFloat screenHeight = 0.0; screenHeight = screenRect.size.width; CGRect screenFrame = CGRectMake(0, -20, self.view.frame.size.width,self.view.frame.size.height+10); self.view.frame = screenFrame; } }