Xcode 6自适应UI如何向后兼容iOS 7和iOS 6?

我刚刚观看了WWDCvideo#216,“用UIKit构build自适应UI”。

在大约45:10托尼Ricciardi谈论在Xcode 6的IB的变化支持新的变动。

他说:“您可以将这些文档向后部署到旧版本的iOS”。

(其中“这些文档”大概是指具有针对不同大小类别的特定设置的XIB和故事板)。

我没有做这个。 去看WWDCvideo。

这怎么可能? 特征集合和大小类只在iOS 8中定义。依赖于iOS 8新增的UI构造的运行时行为如何在以前的iOS版本中运行?

如果这可能的,这将是美好的。 您可以构build将在iOS 6,7和8上运行的应用程序,并利用Apple添加到Xcode 6中的新的灵活UI布局function。我自己在代码中创build了自适应UI逻辑,工作的。

在Interface Builder DO中使用Size Classes对UI进行的更改将在iOS 7设备上正确显示,并在Xcode中预览。 例如,我改变了一些自动布局的约束和字体大小为常规高度常规宽度和这些更改的限制是可见的iPad的模拟器运行iOS 7.0。

所有大小类优化都可用于iOS 7,除了具有“紧凑高度”的大小类别之外。 这已经得到了苹果公司的确认,现在直接在文档中说明 :

对于支持iOS 8之前的iOS版本的应用程序,大多数大小的类都是向后兼容的。

在以下情况下,大小类向后兼容
– 该应用程序是使用Xcode版本6或更高版本构build的
– 应用程序的部署目标早于iOS 8
– 大小类是在故事板或xib中指定的
– 高度组件的值不紧凑

因为iOS 7不尊重几个大小类,所以如果使用它们,就会遇到问题。 举个例子:当你有Compact(紧凑型)任何定义的,然后Compact(紧凑型)h定义的时候,在iOS 7上它将遵循紧凑型的任何h,但是在iOS 8上它会使紧凑型紧凑的h外观。

所以,如果你想要利用这两个大小的类,并保持与iOS 7的兼容性,我会做任何优化,你在任何任何任何h或紧凑任何h景观中的iPhone,然后执行其他优化为不同大小的类如果有必要的话,那么你将不需要使用任何尺寸紧凑的高度的课程,并避免遇到问题。

将应用程序部署到iOS 7时,Xcode将以两种不同的方式编译故事板:

  • 对于iPhone,您的故事板会被编译为“Compact-Regular”(紧凑宽度,常规高度),并将其打包为“〜iphone”笔尖。

  • 对于iPad,你的故事板被编译为“Regular-Regular”,并被打包成你的“〜ipad”笔尖。

所以如果你想要部署到iOS 7和iOS 8,你应该把你的devise集中在Compact-Any和Regular-Any大小的类上。 这将为您在跨部署目标匹配UI方面提供最佳体验。 当然,欢迎您修改其他大小类别的布局,但除非这些修改适用于Compact-Regular或Regular-Regular大小类别,否则您将不会在iOS 7上看到这些修改。

注意:此答案与Xcode 6的testing版相关,不再适用于发货版本。 请参阅本页上的Joey和Dave DeLong的答案以获得正确的信息。

(原始答案保留在下面):


虽然configuration为使用大小类别的Storyboards/XIBs将在iOS 7上运行,但操作系统当前不尊重这些size classes并似乎使用默认的“Any / Any”大小类别。

我同意您提到的特定幻灯片似乎承诺这样的兼容性,但目前似乎不是这种情况(Xcode 6 beta 2)

为了testing,我创build了一个项目(iOS 8 SDK, deployment target of 7.1)使用一个button,该button在Any / Any大小类中vertically and horizontally居中vertically and horizontally居中,但与Compact / Compact大小类中的左上angularalignment例如横向的iPhone)。 Xcode的预览助手显示该button在iOS 8更改其位置,但不是iOS 7 。 我也在iOS 7设备上确认了这种行为。

由于有些答案和评论正在讨论向后兼容的性质,我以为我会直接从苹果文档中分享摘录:

~~~~~

在早期iOS版本上部署带有大小类别的应用程序

对于支持iOS 8之前的iOS版本的应用程序,大多数大小的类都是向后兼容的。

在以下情况下,大小类向后兼容

  • 该应用程序是使用Xcode版本6或更高版本构build的
  • 该应用程序的部署目标是早于iOS 8
  • 大小类是在故事板或xib中指定的
  • 高度组件的值不紧凑

~~~~~

最后一个要点是针对这个讨论,苹果公司确认, 只要使用“紧凑高度” ,它应该保持向后兼容性。

希望这可以帮助别人!

在处理类似的问题时,我发现了另一个我还没有看到的答案。 看起来像XIB文件中的大小类不工作。 如果我在storyboard文件中创build了单元格原型,它可以在其他答案中解释,但是当相同的原型单元格移动到单独的XIB文件中时 – 在iOS7中忽略尺寸类别。

下面是示例项目的链接,演示了这种行为: https : //dl.dropboxusercontent.com/u/6402890/testSizeClasses.zip

在原型单元中,我从灰色视图的每个边缘有四个约束。 每一个都以相同的方式configuration:任何/任何 – 10,常规/常规 – 20

在这里输入图像说明

它在XB和Storyboard的iOS8模拟器中工作正常,在iOS7中,只有在Storyboard中定义的单元格在iPad上获取更新约束:

在这里输入图像说明

如果它节省了所有时间,我相信 Xcode 6为尺寸类提供准后向兼容性的方式是通过历史的~ipad~iphone后缀的故事板,仅此而已。 这是有道理的,因为尺寸类是我们以前如何定义iPad故事板和iPhone故事板的更抽象的方式。

因此:

  • 如果您的目标是使用大小类来支持设备系列特定的布局(iPad与iPhone),那么您很幸运:尺寸类是以前支持的方法的更好的界面。

  • 如果您的目标是使用大小类来支持相同设备系列中不同型号的更改布局 – 即。 iPhone 5/6/6 + inc。 风景,那你倒霉了 。 使用这些将需要最低的iOS 8部署目标。

@lducool – 在界面构build器中,在身份检查器中,将“构build”更改为iOS7.1及更高版本。

不幸的是,戴夫和乔伊的答案不适合我。 我不能在这个post中发表评论,所以请原谅我,如果这是错误的地方。

我已经提出了一个具体的问题: 与iPhone 7向后兼容的iPhone肖像风景自适应UI的示例

从我迄今为止所了解到的情况来看,现在我相信,就像在我的例子中那样,对于基于尺寸类的iPhone iOS7,纵向和横向模式下的一个UI元素不可能有两个单独的,不同的约束条件。 如果我错了,会很高兴。