介绍
在iOS 9中,Apple引入了许多针对iPad的多任务处理功能。 其中包括幻灯片 , 拆分视图和画中画 。 如果您不熟悉这些新功能,这里是简要概述。
滑过
iPad Mini 2及更高版本,所有iPad Air型号和iPad Pro均提供Slide Over。 它允许应用程序从屏幕的右侧滑入,并保持屏幕的整个高度(双向)和iPhone屏幕的大致宽度。
![滑过](https://cms-assets.tutsplus.com/uploads/users/855/posts/25151/image/IMG_0219.jpg)
画中画
画中画功能在所有支持Slide Over的iPad型号上均可用。 当您在iPad上使用其他应用程序时,它可以使视频继续以小视图播放。 这个小视图包含三个按钮,用于控制播放,返回全屏,播放/暂停和关闭。 可以调整视图的大小或暂时将其推到屏幕的一侧。
![画中画视频](https://i-blog.csdnimg.cn/blog_migrate/cd24b071d8d0829206d6a7a7cc953b38.png)
拆分视图
在iPad Mini 4,iPad Air 2和iPad Pro上可以使用Split View。 它允许iPad并排运行两个功能齐全的应用程序。 用户可以在两个应用程序之间移动分隔线以调整大小。
请注意,左侧的应用称为主要应用,右侧的应用称为次应用 应用程式。 主应用程序拥有设备的状态栏,并且始终占据至少一半的屏幕。 但是,如果主应用程序将分隔线一直向左移动,则用户可以将其关闭。
![拆分视图](https://i-blog.csdnimg.cn/blog_migrate/394c2dfa0abd4649d27f82a5c2b0e74a.png)
先决条件
本教程要求您在OS X Yosemite或更高版本上运行Xcode 7或更高版本。 它还假定您已经了解了尺寸类别和自动布局 。 如果您不熟悉自适应设计,那么我建议您阅读Jordan Morgan 关于自适应设计的教程 。 您还需要从GitHub下载入门项目 。
1.滑过并拆分视图
组态
默认情况下,从任何Xcode 7模板创建的所有应用程序都自动支持“滑动和拆分视图”。 这是因为您的应用是使用LaunchScreen.storyboard文件和启用了size类的Main.storyboard文件创建的。
对于使用早期版本的Xcode创建的项目,可以通过以下两个步骤为您的应用启用“滑行”和“拆分视图”。
第1步
通过选择iOS>用户界面>启动屏幕模板来创建LaunchScreen.storyboard文件。 从主屏幕启动您的应用后,并且仍在加载过程中,将显示启动屏幕。
![启动屏幕故事板](https://cms-assets.tutsplus.com/uploads/users/855/posts/25151/image/Screen%20Shot%202015-11-01%20at%2012.50.49%20PM.png)
请注意,此情节提要替换了您已经为应用程序配置的静态启动图像。
第2步
确保您的用户界面正在使用尺寸类别和“ 自动布局” 。 您可以通过选择项目的情节提要,打开“ 文件检查器” ,然后选中“ 使用自动版面”和 在“ 界面生成器文档”部分中使用“尺寸类别”复选框。
![故事板配置](https://i-blog.csdnimg.cn/blog_migrate/dc2bb8d252dfb6d4bc2552e4d8aab643.png)
请注意,您需要为项目中的每个故事板执行此操作。 既然您知道如何正确地为“滑行和分割视图”配置应用程序,是时候学习如何确保您的应用程序与其他应用程序一起正常工作了。
尺寸等级
对于“滑行”,运行时应用程序的当前大小类别将始终相同。 当您的应用是主要应用时,它将可以访问全屏(常规的宽度和高度尺寸类),并且没有什么不同。 通过“滑行”功能打开应用程序时,无论方向如何,应用程序都将具有紧凑的宽度和常规的高度尺寸类。
但是,在支持Split View的iPad上,您可以随时调整应用窗口的大小,并且需要将其设计为适合这些大小。 下图显示了“拆分视图”应用大小的不同配置以及与此相关的大小类别。
![尺寸分类图](https://i-blog.csdnimg.cn/blog_migrate/295cccfdedfa0c9ce668d0c16dbcfd86.png)
如您所见,除非您的应用程序是主要应用程序,并且设备处于横向模式,否则一旦您必须与另一个应用程序共享屏幕时,您的应用程序将被强制设置为紧凑的宽度尺寸类。 由于大小的更改取决于用户,并且随时可能发生,因此您的应用需要能够在不同视图大小之间平滑过渡。
请注意,在iPad Pro上,在横向和50/50分割视图模式下,两个应用程序均具有常规的宽度水平尺寸类别,如下所示。
![iPad Pro水平尺寸等级](https://cms-assets.tutsplus.com/uploads/users/855/posts/25151/image/Simulator%20Screen%20Shot%201%20Nov%202015,%205.49.51%20PM.png)
回调方法
为了解决这些大小上的变化, 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模拟器中运行您的应用程序。 应用启动后,从屏幕右侧拖入并选择列表中的任何应用。
![选择滑盖应用程序](https://i-blog.csdnimg.cn/blog_migrate/cd8f811a21ed79f03abfbfc45293ab9a.png)
打开应用程序后,按住刚打开的应用程序左侧的小条,如下所示。
![开始分割画面](https://i-blog.csdnimg.cn/blog_migrate/6d103757f1eb3e14091ef61f4cd11902.png)
拖动显示在屏幕中间的分隔线,如以下屏幕截图所示,然后松开它。
![居中分屏器](https://i-blog.csdnimg.cn/blog_migrate/c431dfec900749baa27da36f55a04f72.png)
当您的应用淡出时,两个标签应使用正确的视图宽度和水平尺寸类别进行更新。
![更新的标签](https://i-blog.csdnimg.cn/blog_migrate/79480c3f09964d78d55c0e08c8752017.png)
2.画中画视频
与“滑动和拆分视图”一样,如果您使用的是Xcode 7或更高版本,则您的应用将自动支持画中画。 对于视听内容,这是通过使用AVPlayerViewController
类完成的。
但是,在开始使用画中画功能之前,您需要为目标启用功能。 选择您的目标,在项目浏览器中打开“ 功能”选项卡,启用“ 背景模式” ,然后选中“ 音频”,“ AirPlay”和“画中画 ”复选框。
![画中画功能](https://cms-assets.tutsplus.com/uploads/users/855/posts/25151/image/Screen%20Shot%202015-11-01%20at%205.28.32%20PM.png)
再次运行您的应用,然后点击“ 播放视频”按钮。 我在入门项目中包含的视频将开始播放。 在播放视频时,通过按设备上的主屏幕按钮或Command-Shift-H(如果您使用的是模拟器)转到主屏幕。
或者,您可以按左下角的小按钮进入画中画模式。 您会看到视频视图最小化并保留在屏幕上,并带有重新打开,播放/暂停和关闭的按钮。
![画中画视频](https://i-blog.csdnimg.cn/blog_migrate/6aa6c9687f09a14e96f4c4fc0267e05e.png)
在此阶段,您会注意到,如果您按下按钮再次开始以全屏模式观看视频,则该应用将打开,但视频播放视图控制器根本不会出现。 您可以通过使视图控制器符合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