112

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

这是为了什么,为什么 AutoLayout 中缺少它?

在此处输入图像描述

4

6 回答 6

108

注意:我不久前注意到了这个问题,但我现在才发布我的答案,因为 NDA 已被取消

为什么它不会出现在 AutoLayout 中?

您可能已经注意到,iOS 7 带来了全新的外观。UI 元素的外观发生了变化,但它们的一些大小(或一般指标)也发生了变化。这会使同时适应 iOS 7 和它的前辈的界面设计有点痛苦。

苹果官方的说法是使用 AutoLayout 来解决这个问题;这应该可以省去为您布置 UI 元素的麻烦。有时很难做到这一点,特别是如果您出于业务原因仍必须支持 iOS 5,或者您的界面以一种难以实现 AutoLayout 的方式进行管理。因此,如果你属于这个利基类别,Apple 似乎提供了一种让你的工作更轻松的方法,他们称之为 iOS 6/7 Deltas。

好吧,它有什么作用?

虽然 Interface Builder 中的标签对于“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 视图相反;这是因为增量与您正在使用的视图类型相关。如果您正在为 iOS 6 进行编辑,则存在的增量是为了为 iOS 7 正确转换元素(与上面的示例相反)。

为了查看不同的样式,您可以根据将要运行的操作系统更改 Interface Builder 呈现它的方式。这包含在 File Inspector->Interface Builder Document(右侧栏上的第一个选项卡)中,如下所示:

界面风格切换

如果我喜欢手动编写我的界面,这是否存在?

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

总体...

Apple 强烈建议您使用 AutoLayout,它在大多数情况下会让您的生活更轻松。如果您不能使用它(由于上述原因),增量为您提供了根据当前操作系统的指标适当定位 UI 元素的灵活性,而无需在代码中手动重新定位它们。一个很好的例子是调整状态栏的缺失,但还有很多其他用例。

当然,如果你只是为 iOS7 及更高版本开发,你不需要知道这个功能/不会发现它。仅当您需要在使用 iOS7 SDK 构建时让 iOS6 设备运行您的应用程序且没有自动布局时,您才需要增量。

在撰写本文时(8 月 21 日),我找不到任何关于此功能的文档,也找不到 WWDC 材料中的任何提及。我玩过,经过一番研究,这就是我发现的。

于 2013-09-18T11:16:56.940 回答
83

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

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

我相信如果您使用自动布局,则不需要这样做,但是当然,您会失去对 iPad1 的支持,我们中的许多人目前都不愿意承认这一点。

于 2013-09-11T15:11:19.180 回答
30

我知道这已经得到解答,只是添加了一个小变体,希望它也可以帮助那些不使用自动布局但仍希望支持 iOS 6.1 及更早版本的人。

阅读此Apple 的过渡指南 - 支持早期版本

选择“查看方式”到“iOS 7.0 及更高版本”

在此处输入图像描述

iOS 7 的基本 UI。对于 iOS 6,请给出合适的 delta 值。使用预览查看这将如何在 iOS 7 和 iOS 6 设备中呈现。

在此处输入图像描述

快速步骤:

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

在此处输入图像描述

然后,集体选择所有直系子代,并将 delta Y 设为 -20px。您也可以批量或单独执行此操作。

在此处输入图像描述

于 2013-09-24T10:28:53.483 回答
9

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

这些增量用于帮助您调整不同 iOS 版本(主要是 iOS 7 和低于 7 的 iOS 版本)上的视图位置。

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

于 2013-09-17T02:18:52.120 回答
3

为了查看 iOS 6/7 Delta 的实际效果,我将使用在 iOS 6 和 iOS 7 设备上正确显示的 SegmentedControl 进行演示。

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

在此处输入图像描述

在 Interface Builder 画布中,放置 SegmentedControl,使其origin.y为 20。在 iOS 6/7 Delta 中,为 DeltaY 选择 -20

在此处输入图像描述

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

在此处输入图像描述 在此处输入图像描述

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

可以为每个视图单独设置增量,并按照您的预期工作。如果您的故事板或笔尖设置为在 iOS 6 中查看,那么设置增量将导致该视图在 iOS 7 中运行时按照设置的增量量移动和/或调整大小。或者,如果您的情节提要或笔尖设置为查看在 iOS 7 中,则在 iOS 6 中运行时将应用增量

于 2013-11-24T09:20:27.970 回答
0

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

- (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;
}
}
于 2015-07-28T18:55:00.953 回答