AVPlayerLayer
最后我們將講解AVPlayerLayer
擂红。盡管它不是Core Animaiton
框架中的一部分(AV前綴像是贈品)袖牙,AVPlayerLayer
是另一框架的例子(在這里是AVFoundation)病线,它與Core Animation
緊密結(jié)合扰才,提供了一個CALayer
子類來顯示一個自定義內(nèi)容類型伯病。
AVPlayerLayer
用來在iOS上播放視頻柜候。它是高層API如MPMoviePlayer
的底層實現(xiàn)碎连,提供視頻顯示的底層控制灰羽。AVPlayerLayer
的使用也是相當(dāng)直接的:你可以使用+playerLayerWithPlayer:
方法創(chuàng)建一個早已綁定的視頻圖層的圖層,或先創(chuàng)建一個圖層然后使用player
屬性綁定AVPlayer
實例鱼辙。
在我們開始前廉嚼,我們需要向我們項目中添加AVFoundation
框架,因為它并沒有默認(rèn)項目模板中引入倒戏。然后看表6.15中創(chuàng)建簡單視頻播放器的例子怠噪。圖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)詫⑵浼尤胍粋€容器視圖而不是直接加到到控制器主視圖中傍念。這樣我們就可以用普通的自動布局約束來居中圖層矫夷;否則,我們不得不在設(shè)備旋轉(zhuǎn)時程序化調(diào)整其位置憋槐,這是因為Core Animation
不支持自動尺寸和自動布局(看第3章“圖層幾何”獲得詳細(xì)解釋)双藕。
當(dāng)然,因為AVPlayerLayer
是CALayer
的一個子類阳仔,它繼承了它所有的特性忧陪。我們不一定要在一個簡單的矩形中播放視頻;通過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ǔ)知識果录;有些類如CATiledLayer
或CAEmitterLayer
的知識可以作為獨立的章節(jié)來講上枕。然而,關(guān)鍵要記住的是CALayer
是萬金油弱恒,并沒有為所有繪制情況進(jìn)行優(yōu)化辨萍。為了獲得Core Animation
的最佳性能,你需要自行選擇最適合的工具返弹,希望你已經(jīng)受到鼓舞來深入了解不同的CALayer
子類及它們的能力锈玉。
我們在這章的CAEmitterLayer
和AVPlayerLayer
中接觸到了一點動畫。在第二部分中义起,我們從隱式動畫開始深入了解動畫屬性拉背。