2017-08-08 2 views
0

J'essaie d'afficher une vidéo dans une cellule. Au lieu de cela, il se présente comme une boîte noire. Il est possible qu'il n'initialise pas le lecteur. Je fais, cependant voir la boîte noire, donc je sais qu'il initialise VideoPlayerView. Lorsque j'imprime l'image du playerLayer, il imprime (0.0, 0.0, 0.0, 0.0), probablement en raison de la façon dont j'initialise la vue. Est-il possible d'étendre le lecteur aux bords de la vue sans utiliser de cadre?Utilisation de VideoPlayer dans un projet rapide

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") 
} 

}

Merci!

Répondre

0

Vous pouvez définir des contraintes à playerLayer, par exemple:

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

Je reçois une erreur - il est dit que playerLayer n'a pas la propriété translateAutoResizingMaskIntoConstraints. Vous ne savez pas si vous pouvez ajouter des contraintes aux calques. – AashJ

0

J'ai essayé ce couple de façons différentes et a fini par une approche de classe UIView personnalisée (comme vous l'avez fait), mais quelques différences. Par exemple, votre classe pourrait ressembler à ceci:

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 
    } 
} 

Ensuite, vous ajoutez un UIView dans IB, définissez la classe à PlayerView (au lieu de défaut UIView), ajoutez vos contraintes comme normales et faites glisser une sortie vers votre contrôleur comme tout autre contrôle. Pour l'utiliser, vous procédez comme suit:

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

Ensuite, déclenchez la commande Lecture, mais votre application en a besoin.

Vous pouvez créer cette vue dynamiquement en utilisant la même méthode mais j'ai tendance à utiliser IB la plupart du temps.

Espérons que cela aide!

0

Je compris que tout ce que vous devez faire est d'ajouter ce code:

Transforme lorsque vous redimensionnez ne redimensionne pas automatiquement la taille des calques.

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