繁体   English   中英

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

[英]Interface Builder: What are the UIView's Layout iOS 6/7 Deltas for?

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

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

在此处输入图片说明

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

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

您可能已经注意到,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上进行编辑,则可以使用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材料中的任何提及。 我玩了一圈,经过一些研究,这就是我发现的东西。

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

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

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

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

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

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

在此处输入图片说明

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

在此处输入图片说明

快速步骤:

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

在此处输入图片说明

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

在此处输入图片说明

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

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

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

要查看运行中的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中运行时应用

如果使用的是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;
}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM