Xcode 6自适应 UI 如何与 iOS7和 iOS6向后兼容?

我刚刚看了 WWDC 视频 # 216,“用 UIKit 构建自适应用户界面”

在45:10左右,托尼 · 里恰尔迪谈到了对 Xcode 国际商业银行的改革,以支持新的改革。

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

(这里的“这些文档”大概是指 XIBs 和故事板,它们对不同大小的类有特定的设置。)

这不是我编的,去看 WWDC 的视频吧。

这怎么可能?Trait 集合和 size 类只在 iOS8中定义。依赖于 iOS8新的 UI 结构的运行时行为在以前的 iOS 版本中如何工作?

如果它 可能,这将是美妙的。你可以构建可以在 iOS6、7和8上运行的应用程序,并利用苹果在 Xcode 6中增加的新的灵活的 UI 布局功能。我自己在代码中创建了自适应 UI 逻辑,这是一项相当繁重的工作。

42743 次浏览

注意: 这个答案与 Xcode 6的 beta 版本有关,不再适用于正在发布的版本。有关正确信息,请参阅本页 乔伊Dave DeLong的答案。

(原答案保留如下) :


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

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

为了进行测试,我创建了一个项目 (iOS 8 SDK, deployment target of 7.1),其中有一个按钮,该按钮在 Any/Anysize 类中居中为 vertically and horizontally,但在 Compact/Compactsize 类中对齐到左上角(例如横向的 iPhone)。Xcode 的 Preview Assistant 显示按钮在 iOS 8中改变了位置,但是在 iOS 7中没有改变。我在一个 iOS 7设备上也证实了这种行为。

在 ios7设备和 Xcode 的预览版中,使用 Interface Builder DO 对大小类的用户界面所做的修改是正确的。例如,我改变了一些自动布局约束和字体大小的常规高度常规宽度和那些改变的约束可以在运行 iOS 7.0的 iPad 模拟器中看到。

除了拥有紧凑高度的 size 类之外,iOS7提供了所有的 size 类优化。苹果公司已经证实了这一点,并在 文件中直接声明:

对于支持早于 iOS8版本的 iOS 的应用程序,大多数 size 类是向后兼容的。

大小类在下列情况下是向后兼容的:
该应用程序是使用 Xcode 版本6或更高版本构建的
应用程序的部署目标比 iOS8更早
- 大小类在故事板或 xib 中指定
- 身高分量的值不是紧凑的

因为 iOS7不尊重大小类,如果你使用它们,你会遇到问题。例如: 当你定义了 Compactw Anyh,然后定义了 Compactw Compacth,在 iOS7上它会尊重 Compactw Anyh,但是在 iOS8上它呈现了 Compactw Compacth 的外观。

因此,如果你想利用这两个 size 类并保持与 iOS 7的兼容性,我会在 Anyw Anyh 或 Compactw Anyh 中为 iPhone 做任何你想要的横向优化,然后根据需要为不同的 size 类执行其他优化,这样你就不需要使用任何高度紧凑的 size 类,并避免遇到问题。

当把你的应用部署到 iOS7上时,Xcode 会以两种不同的方式编译你的情节串连图板:

  • 对于 iPhone,你的情节串连图板被编译为“ Compact- 标准”(Compactwidth,标准高度) ,这个被打包为你的“ ~ iPhone”笔尖。

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

因此,如果您希望同时部署到 iOS7和 iOS8,那么您应该将设计的重点放在 Compact- 随意和规则-随意大小类上。这将为您提供跨部署目标匹配 UI 方面的最佳体验。当然,我们欢迎您修改其他 size 类的布局,但是除非这些修改应用于 Compact- 常规或者规则-常规 size 类,否则您将不会在 iOS7上看到这些修改。

@ lducool-在 Interface Builder 中,在身份检查器中,将“ Builds For”更改为 iOS7.1及更高版本。

在处理类似问题时,我找到了另一个我在这里还没有看到的答案。看起来 XIB文件中的大小类根本不起作用。如果我在 storyboard文件中创建单元原型,它在 iOS7中可以工作,就像其他答案中解释的那样,但是当相同的原型单元被移动到单独的 XIB文件大小类中时,iOS7会忽略它。

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

在原型单元中,我从灰色视图的每个边缘得到了四个约束。每个属性都以相同的方式进行配置: Any/Any-10、 Rule/Rules-20

enter image description here

在 iOS8模拟器中,XIB 和 Storyboard 都能正常工作,而在 iOS7中,只有 Storyboard 中定义的单元能够在 iPad 上得到更新的约束:

enter image description here

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

因此:

  • 如果您的目标是使用 size 类来支持设备系列的特定布局(iPad vs iPhone) ,那么您很幸运: size 类是以前支持的方法的一个更好的接口。

  • 如果您的目标是使用大小类,以支持改变布局的不同型号的 一样设备家族-即。IPhone 5/6/6 + Inc. 景观,然后你是 真倒霉。使用这些将需要一个最低的 iOS8部署目标。

当一些回答和评论在讨论向后兼容性的本质时,我想我应该分享一段直接来自 苹果文档的摘录:

~~~~~

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

对于支持早于 iOS8版本的 iOS 的应用程序,大多数 size 类是向后兼容的。

大小类在下列情况下是向后兼容的:

  • 该应用程序是使用 Xcode 版本6或更高版本构建的
  • 该应用程序的部署目标比 iOS8更早
  • 大小类在故事板或 xib 中指定
  • 高度分量的值不紧凑

~~~~~

最后一个要点是针对这个讨论,在这里苹果确认 只要“紧凑的高度”是 < em > 而不是 使用,它应该保持向后兼容性。

希望这对谁有帮助!

不幸的是,戴夫和乔伊的回答对我不起作用。 我不允许在这个帖子里评论,所以请原谅我,如果这是错误的地方。

我已经为此编造了一个具体的问题: IPhone 纵向横向自适应 UI 的例子,它向后兼容 iOS7

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