2017-08-08 52 views
0

我試圖在單元格內顯示視頻。相反,它只是作爲一個黑匣子出現。它可能不是初始化玩家。我這樣做,但是看到黑盒子,所以我知道它正在初始化VideoPlayerView。當我打印playerLayer的框架時,它會打印(0.0,0.0,0.0,0.0),這可能是由於我如何初始化視圖。有什麼方法可以在不使用框架的情況下將播放器延伸到視圖的邊緣?在swift項目中使用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,例如:

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

我已經試過這幾個不同的方式,結束了使用自定義UIView類的方法(像你這樣),但有一些差別。例如,你的類看起來是這樣的:

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 

然後觸發Play命令,但是您的應用程序需要它。

您可以使用相同的方法動態創建此視圖,但我傾向於在大多數情況下使用IB。

希望這會有所幫助!

0

我想通了,所有你需要做的就是添加以下代碼:

原來,當你調整它不會自動調整大小層。

override func layoutSublayers(of layer: CALayer) { 
    super.layoutSublayers(of: layer) 
    playerLayer?.frame = self.bounds 
} 
相關問題