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

Posted

技术标签:

【中文标题】Xcode 6 自适应 UI 如何向后兼容 iOS 7 和 iOS 6?【英文标题】:How can Xcode 6 adaptive UIs be backwards-compatible with iOS 7 and iOS 6? 【发布时间】:2014-06-11 21:26:32 【问题描述】:

我刚刚观看了 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 逻辑,而且相当多工作的。

【问题讨论】:

There is also a document 现在来自 Apple,描述了与版本 的兼容性 【参考方案1】:

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

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

对于支持 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 进行横向优化,然后执行其他优化根据需要不同的尺码等级,这样您就不需要使用任何高度紧凑的尺码等级,并且会避免遇到问题。

【讨论】:

我可以确认,在 Beta4 中,Compact/Compact 尺寸类在模拟器或 iOS 7 设备上不受尊重。有趣的是,一些尺寸等级受到尊重。感谢您的测试。 在设备上测试Regular/Regular,它不响应大小类自定义,我得到的只是Any/Any with Beta 7 @hokiewalrus 我刚刚检查了 Xcode 6 beta 7 并得到了与我在答案中详述的完全相同的结果。在运行 iOS 7.1 的 iPad 上,更改 IB 中 Regular Regular 的框宽度确实可以正确显示。 @Joey 这不是错误;这是故意的。 Compact-Compact 不会为 iOS 7 导出; Compact-Regular 是。有关详细信息,请参阅我的答案。 应该是公认的答案,上面的答案有误导性。【参考方案2】:

在将您的应用部署到 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 上看到这些修改。

【讨论】:

我对您的回答的理解是“Regular-Regular”应该在 iPad iOS7 中工作。但它不起作用。我已经在 XCode6 GM 版本中进行了测试。如果我误解了您的答案,请纠正我。 似乎regular-regular 只适用于storyboard,不适用于xib @BorisCharpentier 我报告了一个关于 rdar://18737656 的错误,该错误已作为已打开 #18490866 的副本而关闭 @BorisCharpentier 你找到 xib 的任何解决方案了吗? @BorisCharpentier,我刚刚发现这个问题已经在 XCode 6.1.1 中解决了 :-)【参考方案3】:

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

(原答案保留在下面):


虽然Storyboards/XIBs 配置为使用尺寸等级将在iOS 7 上运行,但操作系统目前不尊重那些size classes 并且似乎使用默认的“任何/任何”尺寸等级。

我同意您所指的特定幻灯片似乎承诺了这种兼容性,但目前(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 设备上确认了这种行为。

【讨论】:

罗伊,感谢您的回复。我还没有时间自己测试这个,我很感激。该视频中的演示者应该更清楚。我想他的意思一定是 iOS 6 和 7 可以读取 XIB/Storyboard 文件,但不支持自适应 UI。它使在 iOS 确实如此。我想知道是否有任何官方文档说明如何在同一个 Storyboard/XIB 中支持新的尺寸类和旧的方向/成语方法。如果我发现任何东西,我会更新答案。 根据我的经验,Apple 似乎认为旧的操作系统版本一旦发布新版本就会不复存在。事实上,工程团队似乎不再关注新的操作系统版本,而是开始将全部精力集中在下一个主要版本上。我从来没有在当前主要版本中提交过修复的错误。他们 Xcode 6 beta 4 似乎不再是这种情况。请参阅我刚刚添加的答案。 @Joey 感谢您的提醒;我已经编辑了我的答案,以向读者推荐您的答案以及 Dave 的答案。【参考方案4】:

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

~~~~~

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

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

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

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

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

希望这对某人有所帮助!

【讨论】:

现在记录在案真是太好了,感谢发帖!【参考方案5】:

在处理类似问题时,我发现了另一个我还没有在这里看到的答案。看起来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 上获得更新的约束:

【讨论】:

$^%$^%@#^&@#%&^% ... 我有很多 xib 文件并部署在 iOS 7 和 8 上。 没错。我将 iPhone 和 iPad 故事板合并为一个,并认为将单元格分成自己的 XIB 文件会有所帮助:)。如果您能 +1 我的回答,我将不胜感激。 我看到了同样的行为。【参考方案6】:

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

因此:

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

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

【讨论】:

【参考方案7】:

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

【讨论】:

输出没有区别。【参考方案8】:

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

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

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

【讨论】:

以上是关于Xcode 6 自适应 UI 如何向后兼容 iOS 7 和 iOS 6?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 7 Stack Views 如何向后兼容 iOS 8 和 iOS 7?

Xcode 5,如何使用与 IOS 6 和 IOS 7 兼容的 UI 构建应用程序 [重复]

如何创建一个向后兼容iOS 5.0的新Xcode 5项目? - 错过故事板错误

Xcode 5 Asset Catalog 是不是向后兼容 pre-iOS 7?

如何使 iOS 7 应用向后兼容?

向后iOS兼容性 - Swift 2