2024年3月10日发(作者:)

1、iOS 9 多任务分屏要点技术分享

   9 多任务综述

  iOS 9

中最引人注目的新特性就是多任务了,在很久以前的越狱开发里就已经出现过

类似的插件,而像是 Windows Surface

系列上也已经有分屏多任务的特性,可以让用户同时使用两个或多个 app。iOS

9 中也新加入类似的特性。iOS 9

中的多任务有三种表现形式,临时出现和交互的滑动覆盖 (Slide

Over),真正的分屏同时操作两个 app 的分割视图 (Split View),以及在其他

app 里依然可以进行视频播放的画中画 (Picture in Picture) 模式。

  在关于多任务的文档中,Apple 明确指出:

  绝大部分 app 都应当适配 Slide Over 和 Split View

  因为这正是 iOS 9

的核心功能之一,也是你的用户所期望看到的。另一方面,支持多任务也增加

了你的用户打开和使用你的 app

的可能。不过多任务有一点限制,那就是在能够安装 iOS 9 的 iPad

设备上,仅只有性能最强大的 iPad Air 2

和之后的机型支持分割视图模式,而其他像是 iPad mini 2,iPad mini 3

以及 iPad Air

只支持滑动覆盖和画中画两种模式。这在一定程度上应该还是基于移动设备资

源和性能限制的考虑做出的决策,毕竟要保证良好的使用体验为前提,多任务

才会有意义。

  对于开发者来说,虽然多种布局看起来很复杂,但是实际上如果紧跟

Apple 的技术步伐的话,将自己的 iPad app

进行多任务适配并不会是一件非常困难的事情。因为滑动覆盖模式和分割视图

模式所采用的布局其实就是 Compact Width 的布局,而这一概念就是 WWDC14

上引入的基于屏幕特征的 UI

布局方式。如果你已经在使用这套布局方式了的话,那么可以说多任务视图的

支持也就顺带自动完成了。不过如果你完全没有使用过甚至没有听说过这套布

局方法的话,我去年的一篇笔记可能能帮你对此有初步了解,在下一节里我也

会稍微再稍微复习一下相关概念和基本用法。

  2.

Adaptive UI 复习

  Adaptive UI 是 Apple 在 iOS 8

提出的概念。在此之前,我们如果想要同时为 iPhone 和 iPad 开发 app

的话,很可能会写很多设备判断的代码,比如这样:

  if UI_USER_INTERFACE_IDIOM() == .Pad {

  // 设备是 iPad

  }

  

除此之外,如果我们想要同时适配横向和纵向的话,我们会需要类似这样的代

码:

  if UIInterfaceOrientationIsPortrait(orientation) {

  // 屏幕是竖屏

  }

  这些判断和分支不仅难写难读,也使适配开发困难重重。从 iOS 8

之后,开发者不应该再依赖这样设备向来进行 UI 适配,而应该转而使用新的

Size Class 体系。Apple

将自家的移动设备按照尺寸区别,将纵横两个方向设计了 Regular 和 Compact

的组合。比如 iPhone 在竖屏时宽度是 Compact,高度是 Regular,横屏时

iPhone 6 Plus 宽度是 Regular,高度是 Compact,而其他 iPhone

在横屏时高度和宽度都是 Compact;iPad 不论型号和方向,宽度及高度都是

Regular。现有的设备的 Size Class 如下图所示:

  针对 Size Class

进行开发的思想下,我们不再关心具体设备的型号或者尺寸,而是根据特定的

Size Class 的特性来展示内容。在 Regular

的宽度下,我们可以在水平方向上展示更多的内容,比如同时显示 Master 和

Detail View Controller

等。同样地,我们也不应该再关心设备旋转的问题,而是转而关心 Size Class

的变化。在开发时,如果是使用 Interface Builder 的话,在制作 UI

时就注意为不同的 Size Class

配置合适的约束和布局,在大多数情况下就已经足够了。如果使用代码的话,U

ITraitCollection 类将是使用和操作 Size Class

的关键。我们可以根据当前工作的 UIViewController 的 traitCollection

属性来设置合适的布局,并且在 -

willTransitionToTraitCollection:withTransitionCoordinator: 和 -

viewWillTransitionToSize:withTransitionCoordinator: 被调用时对 UI

布局做出正确的响应。