界面生成器:UIView的iOS 6/7布局增量有哪些用途?


111

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

这是做什么用的,为什么AutoLayout中缺少此功能?

在此处输入图片说明

Answers:


83

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

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

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


27
对我来说,我发现它是从的iOS 7到iOS 6.增量我垂下元件20分,然后设置德尔塔Y. -20
guptron

这对于UIProgressView尤其有用,它在iOS 7中更苗条
Lee Probert

108

注意:我前一阵子注意到了这个问题,但现在我只发布我的答案,因为NDA已取消

为什么它不会出现在自动版式中?

您可能已经注意到,iOS 7带来了全新的外观。UI元素的外观已更改,但它们的一些尺寸(或一般的指标)也已更改。这可以使界面设计同时适应iOS 7和它的前任产品。

苹果公司的官方路线是使用AutoLayout解决此问题。这会给您布置UI元素带来很多麻烦。有时合并起来并不容易,特别是如果出于商业原因您仍然必须支持iOS 5,或者对界面进行管理时会导致实现AutoLayout困难。因此,如果您属于这一小众类别,Apple似乎提供了一种使您的工作容易一些的方法,并且他们将其称为iOS 6/7 Deltas。

那好,那是做什么的?

尽管在界面生成器中的标签对于“ 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上进行编辑,则可以使用delta,以便为iOS 7正确转换元素(与上述示例相反)。

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

界面样式开关

如果我想手动编写接口代码,这是否存在?

不是直接的,但是通过对代码中的OS版本进行条件检查,并相应地设置正确的位置/大小,可以轻松实现相同的效果。增量功能之所以存在于Interface Builder中,是因为没有代码就无法直接进行条件定位,而Interface Builder的目的就是要为UI尽可能多地获取代码。

总体...

Apple强烈建议您使用AutoLayout,在大多数情况下,它会使您的生活更轻松。如果您不能使用它(由于上述原因),则增量可让您灵活地根据当前OS的指标适当地放置UI元素,而无需手动在代码中重新放置它们。一个很好的例子是根据状态栏的缺乏进行调整,但是还有许多其他用例。

自然,如果您仅针对iOS7及更高版本进行开发,则无需知道此功能/不会发现它。仅当使用iOS7 SDK构建且没有自动布局的情况下需要让iOS6设备运行应用程序时,才需要增量。

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


2
非常感谢WDUK
Kamar

没有性,到目前为止,这就是我需要知道的
碧玉

30

我知道已经解决了这个问题,只是添加一个小的变体,希望它也可以帮助那些不使用自动布局并且仍然希望支持iOS 6.1和更早版本的人。

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

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

在此处输入图片说明

iOS 7的基本UI。对于iOS 6,请提供适当的增量值。使用预览查看如何在iOS 7和iOS 6设备中呈现。

在此处输入图片说明

快速步骤:

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

在此处输入图片说明

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

在此处输入图片说明


9

AutoLayout至少需要iOS 6.0。如果要支持iOS 5.0,则不能使用自动版式。

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

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


1
当我更改这些内容时,什么也没有发生,是否还有其他步骤?
再生钢

@RecycledSteel在这里看到我的答案:链接
Riskov 2013年

3

要查看运行中的iOS 6/7 Delta,我将使用在iOS 6和iOS 7设备上均正确显示的SegmentedControl进行演示。

首先,在情节提要中选择.Xib或ViewController。取消选中“ 使用自动布局”,然后选择“ 以iOS 7及更高版本查看

在此处输入图片说明

在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中运行时应用


0

如果使用的是自动版式,则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;
}
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.