I.6 特定圖層(下)

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()
        }
    }
}
圖6.16 AVPlayerLayer中播放中視頻的某一靜態(tài)幀

盡管我們程序化地創(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()
    }
}
圖6.17 3d旋轉(zhuǎn)、有邊框和圓角的AVPlayerLayer

總結(jié)

這一章提供了許多特定圖層類型的總覽,以及使用它們達(dá)到的效果。我們大多只講解了基礎(chǔ)知識(shí);有些類如CATiledLayerCAEmitterLayer的知識(shí)可以作為獨(dú)立的章節(jié)來(lái)講。然而,關(guān)鍵要記住的是CALayer是萬(wàn)金油,并沒(méi)有為所有繪制情況進(jìn)行優(yōu)化。為了獲得Core Animation的最佳性能,你需要自行選擇最適合的工具,希望你已經(jīng)受到鼓舞來(lái)深入了解不同的CALayer子類及它們的能力。

我們?cè)谶@章的CAEmitterLayerAVPlayerLayer中接觸到了一點(diǎn)動(dòng)畫。在第二部分中,我們從隱式動(dòng)畫開(kāi)始深入了解動(dòng)畫屬性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容