swiftでのAVPlayerの使い方
class AVPlayerView : UIView{ // ・・・①UIViewのclassを継承してAVPlayerViewを作成
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(frame: CGRect) {
super.init(frame: frame)
}
override class func layerClass() -> AnyClass{
return AVPlayerLayer.self // ・・・①AVPlayerLayerの型そのものだけを返す
}
}
override func viewDidLoad() {
// パスからassetを生成.
let path = NSBundle.mainBundle().pathForResource("test", ofType: "mov")
let fileURL = NSURL(fileURLWithPath: path!)
let avAsset = AVURLAsset(URL: fileURL, options: nil)
// AVPlayerに再生させるアイテムを生成.
playerItem = AVPlayerItem(asset: avAsset)
// AVPlayerを生成.
videoPlayer = AVPlayer(playerItem: playerItem)
// Viewを生成.
let videoPlayerView = AVPlayerView(frame: self.view.bounds)
// ・・・③viewの大きさと同じ大きさでAVPlayerViewをインスタンス化してvideoPlayerViewとする
// UIViewのレイヤーをAVPlayerLayerにする.
let layer = videoPlayerView.layer as! AVPlayerLayer
// ・・・④videoPlayerView.layerをAVPlayerLayerに強制ダウンキャストする??
layer.videoGravity = AVLayerVideoGravityResizeAspect
layer.player = videoPlayer
// レイヤーを追加する.
self.view.layer.addSublayer(layer)
・・・
swiftでAVPlayerを使った動画再生のコードの一部ですが、理解できない部分があります。
注釈部分の
①AVPlayerLayerの型そのものだけを返す
ですが、override class func layerClass()は何を行っている部分でしょうか?「.layer」を使った場合に、classの型だけを返すことでしょうか?
④videoPlayerView.layerをAVPlayerLayerに強制ダウンキャストする??
AVPlayerLayerは
NSObject
|- CALayer
|- AVPlayerLayer
のような階層構造になっていますが、videoPayerViewはUIViewを継承したインスタンスです。
NSObject
|- UIResponder
|- UIView
どういう処理(強制ダウンキャストを行うことで得られる処理)をしているのでしょうか?
そもそもの部分で理解が間違っている気がします。理解のヒントになる説明やURLなどご教授お願いします。
端的に理解できないポイントは、
(1) UIViewとAVPlayerLayerとの関係
(2) layerClass(), .layerの理解が正しくない気がします。
(3) ④の強制ダウンキャストをする理由(効果)
です。
理解できない部分が多いのでどう質問すればいいかも不明な部分があって恐縮ですが、何卒よろしくお願いします。