2017-08-08 18 views
0

ビデオをセル内に表示しようとしています。代わりに、それは単にブラックボックスとして登場する。それはプレーヤーを初期化していない可能性があります。私はブラックボックスを見るので、VideoPlayerViewを初期化していることが分かります。 playerLayerのフレームを印刷すると、(0.0、0.0、0.0、0.0)が印刷されます。おそらく、ビューを初期化する方法が原因です。フレームを使用せずにプレーヤーのレイヤーをビューの端まで拡張する方法はありますか?迅速なプロジェクトでVideoPlayerを使用

class VideoPlayerView : UIView { 

override init(frame: CGRect) { 
    super.init(frame: frame) 

    backgroundColor = UIColor.black 

    let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4") 
    let player = AVPlayer(url: videoURL!) 

    let playerLayer = AVPlayerLayer(player: player) 
    playerLayer.frame = self.bounds 
    //print(playerLayer.frame) 

    self.layer.addSublayer(playerLayer) 

    player.play() 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

}

ありがとう!

答えて

0

次の例のように、playerLayerに制約を設定することができます。私はさまざまな方法のこのカップルを試してみましたが、カスタムUIViewクラスのアプローチを使用して(あなたがやったように)が、いくつかの違い終わってきた

let width = UIScreen.main.bounds.width 
let height = 300 

let playerLayer = AVPlayerLayer(player: player) 
playerLayer.translatesAutoresizingMaskIntoConstraints = false 
playerLayer.widthAnchor.constraint(equalToConstant: width).isActive = true 
playerLayer.heightAnchor.constraint(equalToConstant: height).isActive = true 
+0

私はエラーが発生します。これはplayerLayerにはtranslatesAutoResizingMaskIntoConstraintsというプロパティがないと言います。レイヤに制約を追加できるかどうかは不明です。 – AashJ

0

。たとえば、あなたのクラスは次のようになります。

class PlayerView: UIView { 
    var player: AVPlayer? { 
     get { 
      return playerLayer.player 
     } 
     set { 
      playerLayer.player = newValue 
     } 
    } 

    var playerLayer: AVPlayerLayer { 
     return layer as! AVPlayerLayer 
    } 

    // Override UIView property 
    override static var layerClass: AnyClass { 
     return AVPlayerLayer.self 
    } 
} 

その後、あなたはIBでのUIViewを追加し、通常のようなあなたの制約を追加し、あなたのコントローラにコンセントをドラッグし、PlayerView(代わりにデフォルトのUIViewの)にクラスを設定します他のコントロールと同じように。

playerView.player = AVPlayer(url: url) 
playerView.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 

次に、再生コマンドを起動しますが、アプリケーションで必要です。

同じ方法でこのビューを動的に作成することはできますが、ほとんどの場合はIBを使用する傾向があります。

希望すると便利です。

0

私はあなたがする必要があるすべては、このコードを追加していることを考え出した:あなたはそれが自動的にレイヤーのサイズをリサイズしませんサイズを変更する場合

が判明。

override func layoutSublayers(of layer: CALayer) { 
    super.layoutSublayers(of: layer) 
    playerLayer?.frame = self.bounds 
} 
関連する問題