
[code]

    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)
    ・・・
    
[/code]

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) ④の強制ダウンキャストをする理由（効果）  
です。

理解できない部分が多いのでどう質問すればいいかも不明な部分があって恐縮ですが、何卒よろしくお願いします。


CC BY-SA 3.0
2016-05-07T23:31:18.930
24635
2016-07-18T12:02:20.100
8593
question
swift
swiftでのAVPlayerの使い方


`UIView`は内部に`CALayer`のインスタンスを保持しており、`layer`プロパティを通じてこのインスタンスを公開しています。

`UIView`がこのインスタンスを作成する際には、具体的にどのクラスのインスタンスを作成するかを決定するために、`layerClass()`を呼び出し、返されたクラスのインスタンスを作成します。ここでは、`AVPlayerLayer.self`を返しているので、作成されるインタンスは`AVPlayerLayer`クラスのインスタンスになります。

作成されたインスタンスが`AVPlayerLayer`のインスタンスであることが`UIView`によって保証されるため、`videoPlayerView.layer`を`AVPlayerLayer`にダウンキャストすることは問題なく、また、このインスタンスを取得する唯一の方法になります。


CC BY-SA 3.0
2016-05-09T07:26:33.367
24668
2016-05-09T09:48:13.480
2016-05-09T09:48:13.480
3066
3066
24635
answer