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


137

我刚刚观看了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布局功能。工作的。


2
苹果公司现在还有一个文档,描述了与版本<8
Alladinian

Answers:


151

在Interface Builder DO中使用大小类对UI进行的更改在iOS 7设备和Xcode的“预览”中正确显示。例如,我为“常规高度”和“常规宽度”更改了一些“自动布局”约束和字体大小,并且这些更改的约束在运行iOS 7.0的iPad Simulator中可见。

除了具有“紧凑高度”的尺寸类别外,所有尺寸类别优化均适用于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进行横向优化,然后针对不同的大小类执行其他优化必要时,这样就不需要使用任何高度紧凑的尺寸类,并且可以避免遇到问题。


我可以确认,在Beta4中,模拟器或iOS 7设备未遵循紧凑/紧凑尺寸类。有趣的是,某些尺寸等级受到尊重。感谢测试。
remmah

在设备上测试常规/常规,并且它不响应大小类自定义,我得到的只是Beta 7的“任何/任何”
hokiewalrus

@hokiewalrus我刚刚使用Xcode 6 beta 7进行了检查,并获得了我在答案中详述的完全相同的结果。在运行iOS 7.1的iPad上,更改IB中用于常规常规的框的宽度确实可以正确显示。
约旦H

3
@Joey这不是错误;这是故意的。Compact-Compact未导出到iOS 7;Compact-Regular是。请参阅我的答案以获取更多详细信息。
Dave DeLong 2014年

2
应该是公认的答案,以上答案具有误导性。
Dominic Lacaille 2014年

68

在将应用程序部署到iOS 7时,Xcode将以两种不同的方式编译情节提要:

  • 对于iPhone,情节提要被编译为“紧凑常规”(紧凑宽度,常规高度),并且打包为“〜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版本中进行了测试。如果我误解了您的答案,请纠正我。
Iducool 2014年

4
似乎常规/常规只在情节提要上起作用,而不在xib上起作用
Boris Charpentier

@BorisCharpentier我已经报告了一个关于rdar:// 18737656的错误,该错误已作为打开的#18490866的副本关闭
Maxim Pavlov

@BorisCharpentier您是否找到xib的任何解决方案?
saadnib 2014年

4
@BorisCharpentier,我刚刚发现此问题已在XCode 6.1.1中解决:-)
saadnib 2014年

27

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

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


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

我同意您所指的特定幻灯片似乎可以保证具有这种兼容性,但是目前看来并非如此(Xcode 6 beta 2)

为了进行测试,我创建了一个项目(iOS 8 SDK, deployment target of 7.1),该项目具有一个按钮,该按钮vertically and horizontally位于“任意/任意”尺寸类别的中心,但与“紧凑/紧凑”尺寸类别的左上角对齐(例如,横向放置iPhone)。Xcode的预览助手显示该按钮在中的位置发生了变化iOS 8,但没有变化iOS 7。我也在iOS 7设备上确认了此行为。


罗伊,谢谢你的答复。我还没有时间自己测试一下,对此我表示感谢。该视频中的演示者应该更加清晰。我认为他一定是说XIB / Storyboard文件可以由iOS 6和7读取,但不支持自适应UI。它使在iOS <8上运行的应用程序的编码成为问题。
Duncan C

确实。我想知道在同一Storyboard / XIB中是否有任何官方文档说明如何支持较新的尺寸类和较旧的方向/惯用语方法。如果发现任何问题,我将更新答案。
remmah 2014年

根据我的经验,Apple似乎认为较早的操作系统版本在宣布新版本后就不复存在了。实际上,工程团队似乎一开始就停止关注新的OS版本,并开始将精力全放在下一个主要版本上。我从未遇到过在当前主要版本中提交的错误。他们
Duncan C

3
Xcode 6 beta 4似乎不再是这种情况。请参阅我刚刚添加的答案。
约旦H

1
@Joey感谢您的注意;我已经对答案进行了编辑,以使读者和您的答案以及Dave的答案一样。
remmah 2014年

12

当一些答案和评论正在讨论向后兼容的性质时,我想我将直接摘自Apple文档摘录:

~~~~~

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

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

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

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

~~~~~

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

希望这对某人有帮助!


很好,现在已记录在此,谢谢您的发布!
约旦H

3

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

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

在原型单元格中,我从灰度视图的每个边缘有四个约束。每种配置方式都相同:任意/任意-10,常规/常规-20

在此处输入图片说明

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

在此处输入图片说明


$ ^%$ ^%@#^&@#%&^%......我在这里有很多厦门国际银行文件和部署在iOS 7和8
TheEye

究竟。我当时将iPhone和iPad故事板合并为一个,并认为将单元格分隔为自己的XIB文件会有所帮助:)。如果您可以+1我的回答,我们将不胜感激。
2014年

1
我看到了同样的行为。
bjtitus 2014年

2

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

因此:

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

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


1

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


输出无差异。
Iducool 2014年

1

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.