介绍
在iOS 9中,Apple引入了许多针对iPad的多任务处理功能。 其中包括幻灯片 , 拆分视图和画中画 。 如果您不熟悉这些新功能,这里是简要概述。
滑过
iPad Mini 2及更高版本,所有iPad Air型号和iPad Pro均提供Slide Over。 它允许应用程序从屏幕的右侧滑入,并保持屏幕的整个高度(双向)和iPhone屏幕的大致宽度。

画中画
画中画功能在所有支持Slide Over的iPad型号上均可用。 当您在iPad上使用其他应用程序时,它可以使视频继续以小视图播放。 这个小视图包含三个按钮,用于控制播放,返回全屏,播放/暂停和关闭。 可以调整视图的大小或暂时将其推到屏幕的一侧。

拆分视图
在iPad Mini 4,iPad Air 2和iPad Pro上可以使用Split View。 它允许iPad并排运行两个功能齐全的应用程序。 用户可以在两个应用程序之间移动分隔线以调整大小。
请注意,左侧的应用称为主要应用,右侧的应用称为次应用 应用程式。 主应用程序拥有设备的状态栏,并且始终占据至少一半的屏幕。 但是,如果主应用程序将分隔线一直向左移动,则用户可以将其关闭。

先决条件
本教程要求您在OS X Yosemite或更高版本上运行Xcode 7或更高版本。 它还假定您已经了解了尺寸类别和自动布局 。 如果您不熟悉自适应设计,那么我建议您阅读Jordan Morgan 关于自适应设计的教程 。 您还需要从GitHub下载入门项目 。
1.滑过并拆分视图
组态
默认情况下,从任何Xcode 7模板创建的所有应用程序都自动支持“滑动和拆分视图”。 这是因为您的应用是使用LaunchScreen.storyboard文件和启用了size类的Main.storyboard文件创建的。
对于使用早期版本的Xcode创建的项目,可以通过以下两个步骤为您的应用启用“滑行”和“拆分视图”。
第1步
通过选择iOS>用户界面>启动屏幕模板来创建LaunchScreen.storyboard文件。 从主屏幕启动您的应用后,并且仍在加载过程中,将显示启动屏幕。

请注意,此情节提要替换了您已经为应用程序配置的静态启动图像。
第2步
确保您的用户界面正在使用尺寸类别和“ 自动布局” 。 您可以通过选择项目的情节提要,打开“ 文件检查器” ,然后选中“ 使用自动版面”和 在“ 界面生成器文档”部分中使用“尺寸类别”复选框。

请注意,您需要为项目中的每个故事板执行此操作。 既然您知道如何正确地为“滑行和分割视图”配置应用程序,是时候学习如何确保您的应用程序与其他应用程序一起正常工作了。
尺寸等级
对于“滑行”,运行时应用程序的当前大小类别将始终相同。 当您的应用是主要应用时,它将可以访问全屏(常规的宽度和高度尺寸类),并且没有什么不同。 通过“滑行”功能打开应用程序时,无论方向如何,应用程序都将具有紧凑的宽度和常规的高度尺寸类。
但是,在支持Split View的iPad上,您可以随时调整应用窗口的大小,并且需要将其设计为适合这些大小。 下图显示了“拆分视图”应用大小的不同配置以及与此相关的大小类别。

如您所见,除非您的应用程序是主要应用程序,并且设备处于横向模式,否则一旦您必须与另一个应用程序共享屏幕时,您的应用程序将被强制设置为紧凑的宽度尺寸类。 由于大小的更改取决于用户,并且随时可能发生,因此您的应用需要能够在不同视图大小之间平滑过渡。
请注意,在iPad Pro上,在横向和50/50分割视图模式下,两个应用程序均具有常规的宽度水平尺寸类别,如下所示。

回调方法
为了解决这些大小上的变化, UIViewController
类遵循UITraitEnvironment
和UIContentContainer
这两个协议。
UITraitEnvironment
该协议包含一个称为traitCollection
的UITraitCollection
属性和一个用于此trait集合更改的方法traitCollectionDidChange(_:)
。 通过此特征收集对象,您可以查找有关应用程序运行状态的特定详细信息,例如显示比例,当前水平和垂直尺寸类别,3D触摸(API称为“强制触摸”)功能以及当前设备类型。 (iPhone / iPod Touch,iPad,Apple TV或未指定 )。
UIContentContainer
该协议包含preferredContentSize
属性以及用于更改当前容器的大小或特征集合的多种方法。 我们将仔细研究UIContentContainer
协议定义的两种方法。
打开您从GitHub下载的入门项目,然后导航到ViewController.swift 。 接下来,将以下方法添加到类定义中:
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
self.viewWidth.text = "\(size.width)pts wide"
}
override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator: coordinator)
switch newCollection.horizontalSizeClass {
case .Compact:
self.sizeClass.text = "Compact Horizontal Size Class"
case .Regular:
self.sizeClass.text = "Regular Horizontal Size Class"
case .Unspecified:
self.sizeClass.text = "Unspecified Horizontal Size Class"
}
}
在viewWillTransitionToSize(_:withTransitionCoordinator:)
方法中,我们更新viewWidth
标签以显示新的屏幕宽度。
在willTransitionToTraitCollection(_:withTransitionCoordinator:)
方法中,我们检查要转换到哪个水平尺寸类别,并相应地更新sizeClass
标签。
您可能已经注意到,这两种方法都提供了UIViewControllerTransitionCoordinator
参数。 该对象主要用于在视图控制器之间处理动画,并且与系统处理动画的“拆分视图”多任务处理并没有真正的关系。 之所以存在UIViewControllerTransitionCoordinator
参数,是因为这些UIContentContainer
协议方法不是拆分视图多任务处理专用的,还可以在其他情况下执行。
在物理设备或iPad Air 2或iPad Pro模拟器中运行您的应用程序。 应用启动后,从屏幕右侧拖入并选择列表中的任何应用。

打开应用程序后,按住刚打开的应用程序左侧的小条,如下所示。

拖动显示在屏幕中间的分隔线,如以下屏幕截图所示,然后松开它。

当您的应用淡出时,两个标签应使用正确的视图宽度和水平尺寸类别进行更新。

2.画中画视频
与“滑动和拆分视图”一样,如果您使用的是Xcode 7或更高版本,则您的应用将自动支持画中画。 对于视听内容,这是通过使用AVPlayerViewController
类完成的。
但是,在开始使用画中画功能之前,您需要为目标启用功能。 选择您的目标,在项目浏览器中打开“ 功能”选项卡,启用“ 背景模式” ,然后选中“ 音频”,“ AirPlay”和“画中画 ”复选框。

再次运行您的应用,然后点击“ 播放视频”按钮。 我在入门项目中包含的视频将开始播放。 在播放视频时,通过按设备上的主屏幕按钮或Command-Shift-H(如果您使用的是模拟器)转到主屏幕。
或者,您可以按左下角的小按钮进入画中画模式。 您会看到视频视图最小化并保留在屏幕上,并带有重新打开,播放/暂停和关闭的按钮。

在此阶段,您会注意到,如果您按下按钮再次开始以全屏模式观看视频,则该应用将打开,但视频播放视图控制器根本不会出现。 您可以通过使视图控制器符合AVPlayerViewControllerDelegate
协议来更改此行为。
首先使ViewController
类符合AVPlayerViewControllerDelegate
协议。
class ViewController: UIViewController, AVPlayerViewControllerDelegate
接下来,用以下实现替换prepareForSegue(_:sender:)
:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let destination = segue.destinationViewController as!
AVPlayerViewController
destination.delegate = self
let url = NSBundle.mainBundle().URLForResource("Video", withExtension: "mp4")!
destination.player = AVPlayer(URL: url)
destination.player?.play()
}
最后,将AVPlayerViewControllerDelegate
协议的playerViewControllerShouldAutomaticallyDismissAtPictureInPictureStart(_: AVPlayerViewController)
方法添加到ViewController
类。
func playerViewControllerShouldAutomaticallyDismissAtPictureInPictureStart(playerViewController: AVPlayerViewController) -> Bool {
return false
}
通过实现此方法,我们确保当进入画中画模式时,视频播放器视图控制器不会关闭。 再次构建并运行您的应用程序,您会看到从画中画重新打开时,视频将继续播放。
如果您没有使用AVPlayerViewController
播放内容,则可以通过其他方法来支持画中画视频。 如果使用AVPlayerLayer
允许在视频周围使用自定义用户界面,则可以创建AVPictureInPictureController
对象以支持画中画。 这样的实现可能看起来像这样:
self.pictureinPictureController = AVPictureInPictureController(playerLayer: layer)
self.pictureinPictureController.delegate = // Any object conforming to the AVPictureInPictureViewControllerDelegate protocol
if AVPictureInPictureController.isPictureInPictureSupported() {
// Display button to enter Picture in Picture
}
...
func pictureinPictureButtonPressed() {
self.pictureInPictureController.startPictureInPicture()
}
3.禁用iPad多任务
如果由于某种原因,您不希望您的应用程序支持幻灯片,分割视图或画中画,则可以覆盖Xcode和iOS提供的默认行为。
滑过并拆分视图
对于“滑动和拆分视图”,您需要做的就是将UIRequiresFullScreen
键添加到应用程序的Info.plist文件中,并将其设置为YES
。
画中画
使用AVPlayerViewController
类,您只需要将allowsPictureInPicturePlayback
属性设置为false
。
对于具有AVPlayerLayer
对象的画中画,您不会创建AVPictureInPictureController
。
最后,对于通过WKWebView
通过网络显示的视频,您需要将视图configuration
的allowsPictureInPicturePlayback
属性设置为false
。
结论
现在,您应该对创建支持添加到iOS 9的iPad上的新的“滑行”,“拆分视图”和“画中画”多任务处理功能的应用程序充满信心。如您所见,这些新功能使iPad成为更具生产力的工具,对于开发人员来说,在自己的应用程序中实现非常容易。
与往常一样,您可以在下面的评论中留下您的评论和反馈。
翻译自: https://code.tutsplus.com/tutorials/ios-9-an-introduction-to-multitasking-on-ipad--cms-25151