AVPlayerLayer
最后我们将讲解AVPlayerLayer
。尽管它不是Core Animaiton
框架中的一部分(AV前缀像是赠品),AVPlayerLayer
是另一框架的例子(在这里是AVFoundation),它与Core Animation
紧密结合,提供了一个CALayer
子类来显示一个自定义内容类型。
AVPlayerLayer
用来在iOS上播放视频。它是高层API如MPMoviePlayer
的底层实现,提供视频显示的底层控制。AVPlayerLayer
的使用也是相当直接的:你可以使用+playerLayerWithPlayer:
方法创建一个早已绑定的视频图层的图层,或先创建一个图层然后使用player
属性绑定AVPlayer
实例。
在我们开始前,我们需要向我们项目中添加AVFoundation
框架,因为它并没有默认项目模板中引入。然后看表6.15中创建简单视频播放器的例子。图6.16展示了播放中的视频播放器。
表6.15 使用AVPlayerLayer播放视频
import UIKit
import AVFoundation
class ViewController: UIViewController {
@IBOutlet weak var containerView: UIView!
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// 判断横屏
let screenSize = UIScreen.mainScreen().applicationFrame.size
if (screenSize.width > screenSize.height) {
// 获得视频URL
let URL = NSBundle.mainBundle().URLForResource("Ship", withExtension: "mp4")
// 创建播放器及其图层
let player = AVPlayer(URL: URL)
let playerLayer = AVPlayerLayer(player: player)
// 设置播放器图层帧并加到视图中
playerLayer.frame = self.containerView.bounds
self.containerView.layer.addSublayer(playerLayer)
// 播放视频
player.play()
}
}
}
尽管我们程序化地创建了AVPlayerLayer
,我们仍将其加入一个容器视图而不是直接加到到控制器主视图中。这样我们就可以用普通的自动布局约束来居中图层;否则,我们不得不在设备旋转时程序化调整其位置,这是因为Core Animation
不支持自动尺寸和自动布局(看第3章“图层几何”获得详细解释)。
当然,因为AVPlayerLayer
是CALayer
的一个子类,它继承了它所有的特性。我们不一定要在一个简单的矩形中播放视频;通过6.16中的额外代码,我们可以3D旋转视频并添加圆角、彩色边框、遮罩、投影等(如图6.17)。
表6.16 给视频增加变形、边框和圆角
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// 判断横屏
let screenSize = UIScreen.mainScreen().applicationFrame.size
if (screenSize.width > screenSize.height) {
// 获得视频URL
let URL = NSBundle.mainBundle().URLForResource("Ship", withExtension: "mp4")
// 创建播放器及其图层
let player = AVPlayer(URL: URL)
let playerLayer = AVPlayerLayer(player: player)
// 设置播放器图层帧并加到视图中
playerLayer.frame = self.containerView.bounds
self.containerView.layer.addSublayer(playerLayer)
// 变形图层
var transform = CATransform3DIdentity
transform.m34 = -1.0 / 500.0
transform = CATransform3DRotate(transform, CGFloat(M_PI_4), 1, 1, 0)
playerLayer.transform = transform
// 添加圆角和边框
playerLayer.masksToBounds = true
playerLayer.cornerRadius = 20.0
playerLayer.borderColor = UIColor.redColor().CGColor
playerLayer.borderWidth = 5.0
// 播放视频
player.play()
}
}
总结
这一章提供了许多特定图层类型的总览,以及使用它们达到的效果。我们大多只讲解了基础知识;有些类如CATiledLayer
或CAEmitterLayer
的知识可以作为独立的章节来讲。然而,关键要记住的是CALayer
是万金油,并没有为所有绘制情况进行优化。为了获得Core Animation
的最佳性能,你需要自行选择最适合的工具,希望你已经受到鼓舞来深入了解不同的CALayer
子类及它们的能力。
我们在这章的CAEmitterLayer
和AVPlayerLayer
中接触到了一点动画。在第二部分中,我们从隐式动画开始深入了解动画属性。