AVPlayerLayer
最后我們將講解AVPlayerLayer
。盡管它不是Core Animaiton
框架中的一部分(AV前綴像是贈(zèng)品),AVPlayerLayer
是另一框架的例子(在這里是AVFoundation),它與Core Animation
緊密結(jié)合,提供了一個(gè)CALayer
子類來(lái)顯示一個(gè)自定義內(nèi)容類型。
AVPlayerLayer
用來(lái)在iOS上播放視頻。它是高層API如MPMoviePlayer
的底層實(shí)現(xiàn),提供視頻顯示的底層控制。AVPlayerLayer
的使用也是相當(dāng)直接的:你可以使用+playerLayerWithPlayer:
方法創(chuàng)建一個(gè)早已綁定的視頻圖層的圖層,或先創(chuàng)建一個(gè)圖層然后使用player
屬性綁定AVPlayer
實(shí)例。
在我們開(kāi)始前,我們需要向我們項(xiàng)目中添加AVFoundation
框架,因?yàn)樗](méi)有默認(rèn)項(xiàng)目模板中引入。然后看表6.15中創(chuàng)建簡(jiǎn)單視頻播放器的例子。圖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")
// 創(chuàng)建播放器及其圖層
let player = AVPlayer(URL: URL)
let playerLayer = AVPlayerLayer(player: player)
// 設(shè)置播放器圖層幀并加到視圖中
playerLayer.frame = self.containerView.bounds
self.containerView.layer.addSublayer(playerLayer)
// 播放視頻
player.play()
}
}
}
盡管我們程序化地創(chuàng)建了AVPlayerLayer
,我們?nèi)詫⑵浼尤胍粋€(gè)容器視圖而不是直接加到到控制器主視圖中。這樣我們就可以用普通的自動(dòng)布局約束來(lái)居中圖層;否則,我們不得不在設(shè)備旋轉(zhuǎn)時(shí)程序化調(diào)整其位置,這是因?yàn)?code>Core Animation不支持自動(dòng)尺寸和自動(dòng)布局(看第3章“圖層幾何”獲得詳細(xì)解釋)。
當(dāng)然,因?yàn)?code>AVPlayerLayer是CALayer
的一個(gè)子類,它繼承了它所有的特性。我們不一定要在一個(gè)簡(jiǎn)單的矩形中播放視頻;通過(guò)6.16中的額外代碼,我們可以3D旋轉(zhuǎn)視頻并添加圓角、彩色邊框、遮罩、投影等(如圖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")
// 創(chuàng)建播放器及其圖層
let player = AVPlayer(URL: URL)
let playerLayer = AVPlayerLayer(player: player)
// 設(shè)置播放器圖層幀并加到視圖中
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()
}
}
總結(jié)
這一章提供了許多特定圖層類型的總覽,以及使用它們達(dá)到的效果。我們大多只講解了基礎(chǔ)知識(shí);有些類如CATiledLayer
或CAEmitterLayer
的知識(shí)可以作為獨(dú)立的章節(jié)來(lái)講。然而,關(guān)鍵要記住的是CALayer
是萬(wàn)金油,并沒(méi)有為所有繪制情況進(jìn)行優(yōu)化。為了獲得Core Animation
的最佳性能,你需要自行選擇最適合的工具,希望你已經(jīng)受到鼓舞來(lái)深入了解不同的CALayer
子類及它們的能力。
我們?cè)谶@章的CAEmitterLayer
和AVPlayerLayer
中接觸到了一點(diǎn)動(dòng)畫。在第二部分中,我們從隱式動(dòng)畫開(kāi)始深入了解動(dòng)畫屬性。