137

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

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

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

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

我不是在编造这个。去观看 WWDC 视频。

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

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

4

8 回答 8

151

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

iOS 7 提供了所有尺寸类优化,但具有紧凑高度的尺寸类除外。这已得到 Apple 的确认,现在直接在文档中说明:

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

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

因为 iOS 7 不尊重几个尺寸等级,如果你使用它们你会遇到问题。例如:当您定义了 Compact w Any h,然后定义了 Compact w Compact h,在 iOS 7 上它将尊重 Compact w Any h,但在 iOS 8 上它呈现 Compact w Compact h 外观。

因此,如果您想利用这两个尺寸等级并保持与 iOS 7 的兼容性,我会在 Any w Any h 或 Compact w Any h 中对 iPhone 进行横向优化,然后针对不同的尺寸等级执行其他优化根据需要,这样您就不需要使用任何具有紧凑高度的尺寸等级,并且可以避免遇到问题。

于 2014-07-27T00:32:17.933 回答
68

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

  • 对于 iPhone,您的情节提要被编译为“Compact-Regular”(紧凑宽度,常规高度),并被打包为您的“~iphone”笔尖。

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

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

于 2014-09-11T19:24:14.527 回答
27

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

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


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

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

为了进行测试,我创建了一个项目(iOS 8 SDK, deployment target of 7.1),其中有一个按钮,该按钮vertically and horizontally位于 Any/Any 尺寸类的中心,但与 Compact/Compact 尺寸类的左上角对齐(例如横向 iPhone)。Xcode 的 Preview Assistant 显示该按钮在 中更改其位置iOS 8,但不是iOS 7iOS 7我也在设备上确认了这种行为。

于 2014-06-21T03:13:17.293 回答
12

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

~~~~~

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

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

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

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

~~~~~

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

希望这对某人有帮助!

于 2014-11-07T11:22:54.540 回答
3

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

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

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

在此处输入图像描述

它在 XIB 和 Storyboard 的 iOS8 模拟器中运行良好,在 iOS7 中,只有 Storyboard 中定义的单元格在 iPad 上获得更新的约束:

在此处输入图像描述

于 2014-10-24T16:23:32.193 回答
2

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

所以:

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

  • 如果您的目标是使用尺寸类来支持同一设备系列中不同型号的更改布局 - 即。iPhone 5/6/6+ 公司 风景,那你就不走运了。使用这些将需要最低 iOS 8 部署目标。

于 2014-11-04T17:24:20.030 回答
1

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

于 2014-09-23T10:20:30.957 回答
1

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

我为此提出了一个具体问题: 与 iOS 7 向后兼容的 iPhone 纵向横向自适应 UI 示例

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

于 2014-11-08T23:00:05.937 回答