体验中操作连贯性的,一个重要特性。Handoff 让用户可以跨设备执行同一个操作。比如,你在 Mac 的 Safari 上看一篇很长的文章,当你转到另外一个 iOS 设备上的 Safari 时,这篇文章的浏览进度是和 Mac 同步的。Handoff 可以让交互体验做到无缝连接。
如果你的 App 想使用这个功能,你只需要实现一个很小的 API 就好了。这样的话,每一个用户正在做的事情都会放在一个对象里面,这个对象内有恢复此次操作的关键数据。当用户选择继续这次操作时,这个对象就会传到需要恢复操作的设备上。为此,有一些代理会在恰当的时期去执行并更新操作状态,例如用户操作数据的对象刚传到设备上的时候。
如果进行一个操作需要的数据比基础数据多,新拉起的 app 有机会和原来的 app 建立一个数据传输流。文件操作类的 app 默认支持该功能,前提是操作的是 iCloud 共享的文件。
#Supporting New Screen Sizes and Scales
这段我没有按原文直译过来。(关键是我size class用的不是很好,误导了阅读的人就不好了,23333)
与 iOS 8 一起问世的是两个有划时代意义的手机型号:iPhone 6 和 iPhone 6 Plus。不过我要吐槽两点:
1. Apple 打了自己的脸,6 系列手机无法单手操作了。(其实 iPhone 6 及后续机型轻轻双触 Home 键,就可以单手操作了,试试看吧)
2. iPhone 6 Plus 是所有 iPhone 里面运行内存性价比最低的手机,大尺寸小内存,容易内存耗尽,闪退率最高的机型。(而大多数开发者都不处理内存警告的通知)
简单说一下这个适配的更新吧。
1. iOS 8 开始可以使用 Metal 给 6 Plus 更好的体验,这个估计国内没几个人做过。
2. Size Class,可以适配所有的尺寸,老板再也不用担心你开发的慢了。
3. iOS 8 开始可以使用 storyboard 作为启动页面了,事实上你新建项目的时候就会自动生成一个。
###Traits Describe the Size Class and Scale of an Interface
iOS 8 加入了 Size Class 作为 UI 搭建的一个特性。这个特性把 页面分成两种:常规型(regular)和紧凑型(compact)。常规的用来代表一个大的屏幕尺寸,例如 iPad、或者一些大的视图:iPhone 的滚动视图。每种设备都被定义了一种 Size Class,包括横竖屏状态。原文有几张示意图,我就不贴了。
一个页面可以关联多种 Size Class。这个可以很好的处理下面这种情况:一个小的页面需要在一个大页面下展示,你可以选一个Size Class来放大图,用另一个你喜欢的来放小图。当然为了适配 Size Class,API有所变动:
1. UITraitCollection 这个类是用来描述一个对象的特征的集合。表征一个对象的 Size Class、缩放比例和特有平台的描述(为了合理翻译 idiom 这个单词,我看了好多 Apple 的文档,最后觉得这是 Apple 用于说明不同平台语言特性的,暗指 iOS 不同运行平台的特有 API)。UIScreen、UIViewController 和 UIView 都是支持 UITraitEnvironment 的代理的,所以他们都有特征的集合。你可以检索某个对象的特征,并可以在他变化时做一些操作。
2. UIImageAsset 这个类可以按照图片的特性对他们进行编组管理。把带有同一特征的相似的图片合并到一个资源下,然后自动检索并使这个资源正确拥有对应特征集合的图片。为此 UIImage 也做了一些修改。
3. 支持 UIAppearance 协议的类,可以基于自己特征集合定义一个对象的外观。
4. UIViewController 新增了查询子页面特征集合的能力。你可以用这个方法 viewWillTransitionToSize:withTransitionCoordinator: 去改变布局出来的页面的 Size Class。
Xcode 6 开始支持统一的故事版。在故事版上,你可以任意操作基于每个 Size Class 的 ViewConrtoller 上面的 views。你可以使用同一个故事版构建不同的 Size Class 来做两个相似的页面。首先,建立一个通用的故事版,然后自定义每一个 Size Class 里面的样式内容。你使用 Xcode 6 来检测 app 在各个 Size Class 下的兼容情况。
###Supporting New Screen Scales
从6 Plus 开始,高清晰度的R屏投入了使用。为了用好这块屏幕,6 Plus 是用了 414 x 736 的Size 和 1242 x 2208 pixels的分辨率(对应3.0的Scale)。不过在显示的时候,UIKit会把它渲染为1080P的。为了适应这个尺寸,ArtWork中需要加入 @3x 的图片,6 Plus在加载的时候会优先加载 @3x 的素材。
在图形app中使用 Metal 或者 OpenGL ES,可以更加容易的绘制精确图形,而不需要其他大量的取样。这一点对于需要高密度计算的 3D app 来说很关键。还有,建立渲染的缓冲区也可以很好的解决这类问题。
UIScreen 提供了一个新的属性 nativeScale,这个属性用来表示 native 页面的 Scale 值。当这个值和 Screen 的 scale 属性一样的时候,可以按照 Screen 同样的渲染像素尺寸进行渲染。如果不一样的时候,你可以在显示之前给出取样范围。
如果你正在写一个 OpenGL ES 的 app,GLKView 会自动为你创建一个基于页面 Size 和 contentScaleFactor 属性值的缓冲区对象。当这个View被加入到window上时,需要把这个值赋值给window.screen.nativeScale。
* Listing 1:
> - (void) didMoveToWindow {
> self.contentScaleFactor = self.window.screen.nativeScale;
> }
如果你写的是基于 Metal 的,也有和上面的类似的操作。另外,每当页面 size 改变时,在这之前,你要让 Meta