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

时间:2014-06-11 21:26:32

标签: xcode6 adaptive-ui

我刚观看了WWDC视频#216,“使用UIKit构建自适应UI。”

大约在45:10,Tony Ricciardi谈到了Xcode 6中IB的变化,以支持新的变化。

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

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

我不是这样做的。去观看WWDC视频。

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

如果 可能会很棒。您可以构建将在iOS 6,7和8上运行的应用程序,并利用Apple添加到Xcode 6中的新的灵活UI布局功能。我已经在代码中创建了自适应UI逻辑,并且它有点相当工作的。

8 个答案:

答案 0 :(得分:151)

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

除了具有紧凑高度的大小类之外,所有大小类优化都可用于iOS 7。这已得到Apple的确认,现在直接在documentation

中说明

对于支持早于iOS 8的iOS版本的应用,大多数尺寸类都向后兼容。

在以下情况下,尺寸类向后兼容:
- 该应用程序使用Xcode版本6或更高版本构建 - 应用程序的部署目标早于iOS 8 - 大小等级在故事板或xib中指定 - 高度分量的值不紧凑

因为iOS 7不尊重几个大小类,如果你使用它们,你会遇到问题。例如: 如果你有Compact w任何定义的,然后定义Compact w Compact h,在iOS 7上它将尊重Compact w Any h但是在iOS 8上它呈现Compact w Compact h外观。

所以,如果你想利用这两个大小的类并保持与iOS 7的兼容性,我会做任何你想要的任何优化你想要的任何w或任何h或任何h的任何h,然后执行你的其他优化根据需要使用不同大小的类,这样您就不需要使用任何具有紧凑高度的大小类,并且可以避免遇到问题。

答案 1 :(得分:68)

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

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

  • 对于iPad,您的故事板被编译为“常规 - 常规”,并打包为“~ipad”笔尖。

因此,如果您希望部署到iOS 7和iOS 8,则应将您的设计重点放在Compact-Any和Regular-Any大小类上。这将为您提供跨部署目标匹配UI的最佳体验。当然,欢迎您修改其他大小类的布局,但除非这些修改将应用于Compact-Regular或Regular-Regular大小类,否则您将无法在iOS 7上看到这些修改。

答案 2 :(得分:27)

注意:此答案与Xcode 6的测试版相关,不再适用于发货版本。请参阅此页面上JoeyDave DeLong的答案,以获取正确的信息。

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


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

我同意您所指的特定幻灯片似乎承诺这种兼容性,但目前似乎并非如此(Xcode 6 beta 2)

为了测试,我创建了一个项目(iOS 8 SDK, deployment target of 7.1),其中一个按钮在Any / Any尺寸类中居中vertically and horizontally,但与Compact / Compact尺寸类的左上角对齐(例如,风景中的iPhone)。 Xcode的预览助手显示该按钮更改了iOS 8中的位置,但未更改iOS 7。我也在iOS 7设备上确认了此行为。

答案 3 :(得分:12)

由于一些答案和评论正在讨论向后兼容性的性质,我想我会直接从 Apple Documentation 分享一段摘录:

~~~~~

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

对于支持早于iOS 8的iOS版本的应用,大多数尺寸类都向后兼容。

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

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

~~~~~

最后一个要点针对的是这个讨论,Apple确认只要“紧凑高度” ,它就应该保持向后兼容性。

希望这有助于某人!

答案 4 :(得分:3)

在处理类似问题时,我发现了另一个我尚未在此处看到的答案。看起来XIB文件中的大小类根本不起作用。如果我在storyboard文件中创建单元格原型,它在iOS7中工作,如其他答案中所述,但是当相同的原型单元格被移动到单独的XIB文件中时 - 在iOS7中忽略大小类。

以下是演示此行为的示例项目的链接:https://dl.dropboxusercontent.com/u/6402890/testSizeClasses.zip

在原型单元格中,我从灰色视图的每个边缘有四个约束。每个配置方式相同:Any / Any - 10,Regular / Regular - 20

enter image description here

它在iOS8模拟器中适用于XIB和Storyboard,在iOS7中,只有在Storyboard中定义的单元格才能在iPad上获得更新约束:

enter image description here

答案 5 :(得分:2)

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

因此:

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

    < / LI>
  • 如果您的目标是使用大小类来支持相同设备系列中不同模型的更改布局 - 即。 iPhone 5/6/6 + inc。风景,然后你运气不好。使用这些将需要最低iOS 8部署目标。

答案 6 :(得分:1)

@lducool - 在界面构建器中,在Identity检查器中,将“Builds For”更改为iOS7.1及更高版本。

答案 7 :(得分:1)

不幸的是Dave和Joey的答案对我不起作用。 我不被允许在这个帖子中发表评论,所以请原谅我,如果这是错误的地方。

我已经为此提出了一个具体问题: Example for iPhone portrait landscape adaptive UI which is backwards-compatible with iOS 7

从我到目前为止所学到的,我现在相信,就像在我的例子中一样,对于基于大小类的iPhone iOS7的纵向和横向模式中的一个ui元素,不可能有两个单独的,不同的约束。 如果我错了,会很高兴。