界面生成器:什么是UIView';s布局iOS 6/7增量用于?

界面生成器:什么是UIView';s布局iOS 6/7增量用于?,ios,layout,uiview,xcode5,Ios,Layout,Uiview,Xcode5,我刚刚注意到在UIView的structs布局下发现的iOS 6/7 Delta属性 这是干什么用的?为什么自动布局中缺少这一功能 这实际上是指从iOS6到iOS7的布局位置之间的差值 在iOS7中,一些视图可以隐藏状态栏或使其透明,实际上,它覆盖在视图的顶部。因此,如果在iOS6上将UI元素放置在(0.0,0.0)位置,它将显示在状态栏下方,但在iOS7上,它将部分显示在状态栏下方。因此,在这种情况下,您需要一个与状态栏高度(20.0点)匹配的增量,以便布局在iOS6和iOS7中看起来相同 我

我刚刚注意到在UIView的structs布局下发现的iOS 6/7 Delta属性

这是干什么用的?为什么自动布局中缺少这一功能


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

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


我相信,如果您使用autolayout,就不需要这样做,但当然,这样您就失去了iPad1的支持,我们中的许多人现在都不愿意放弃这一点

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

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

我使用这些值来帮助我喜欢这张图片。 注意:我刚才注意到这个问题,但我现在只发布我的答案,因为保密协议已经取消

为什么它不显示为自动布局? 您可能已经注意到,iOS 7带来了全新的外观。UI元素的外观发生了变化,但它们的一些大小(或总体指标)也发生了变化。这会使界面设计既能适应iOS 7,也能适应它的前辈,这有点麻烦

苹果的官方路线是使用自动布局来解决这个问题;这将为您排布UI元素带来很多麻烦。有时合并这一点并不容易,特别是如果出于业务原因您必须仍然支持iOS 5,或者您的界面管理方式使实现自动布局变得困难的话。因此,如果你属于这个利基类别,苹果似乎提供了一种让你的工作更轻松的方法,他们称之为iOS 6/7 Delta

好吧,那它是做什么的? 虽然Interface Builder中的标签对于“Delta”在本上下文中的含义有点不清楚,但与此功能相对应的.xib文件中包含的代码更清楚:

密钥名称
insetFor6xAndEarlier
明确说明了它的作用;在iOS 7的前置版本上运行时,您可以为UI元素提供可选的插入。例如,上面定义了以下增量变化:

x: 50
y: 100
width: -100
height: 200
虽然.xib中存储的值与引用的值不直接对应,但它们之间存在相关性

x: -minX
y: -minY
width: minX + maxX
height: minY + maxY
下图直观地显示了这一变化。这是一个非常极端的例子,但这是为了证明它的能力。实际上,我只希望增量变化只有几个像素

您可能会注意到,这些值与iOS 6视图相反;这是因为增量与您正在使用的视图类型有关。如果您正在为iOS 6进行编辑,则存在增量,以便为iOS 7正确转换元素(与上面的示例相反)

为了查看不同的样式,您可以根据Interface Builder将要运行的操作系统更改Interface Builder显示样式的方式。这包含在文件检查器->界面生成器文档(右栏的第一个选项卡)中,如下所示:

如果我喜欢手工编写接口,是否存在这种情况? 不直接,但您可以通过在代码中对OS版本进行条件检查,并相应地设置正确的位置/大小,轻松实现相同的效果。Interface Builder中存在增量功能,因为如果没有代码,就无法直接进行条件定位,而Interface Builder的目的是为UI尽可能多地提供代码

总的来说。。。 苹果公司强烈建议您使用自动布局,在大多数情况下,它会让您的生活更轻松。如果您无法使用它(出于上述原因),Delta可以根据当前操作系统的度量为您提供适当定位UI元素的灵活性,而无需在代码中手动重新定位它们。一个很好的例子是调整状态栏的缺乏,但是还有很多其他用例

当然,如果您只是为iOS7及更高版本开发,您不需要了解这个特性/不会发现它。只有在使用ios7sdk构建应用程序时需要让iOS6设备运行应用程序,而不需要自动布局时,才需要delta


在撰写本文时(8月21日),我找不到任何关于此功能的文档,也找不到WWDC材料中提到的任何内容。我做了一番尝试,经过一点研究,我发现了这一点。

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

读这个

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

iOS 7的基本用户界面。对于iOS 6,给出合适的增量值。使用“预览”查看在iOS 7和iOS 6设备中的渲染方式

快速步骤:

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

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


要查看iOS 6/7 Delta的运行情况,我将使用在iOS 6和iOS 7设备上正确显示的分段控件进行演示

首先,在故事板中选择.Xib或ViewController。取消选中“使用自动布局”,然后选择“查看为iOS 7及更高版本”

在Interface Builder画布中,放置分段控件,使其origin.y为20。在iOS 6/7 Delta中,为DeltaY选择-20
- (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;
}
}