AVPlayerLayer没有绑定到UIView框架

Jor*_*kum 15 iphone xcode cglayer avplayerlayer swift

我正在尝试将AVPlayerLayer添加到UIView

    self.player = AVPlayer(URL: NSURL(fileURLWithPath: path!))
    self.playerLayer = AVPlayerLayer(player: player);
    self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    self.playerLayer.frame =  ctrVideo.bounds;
    self.ctrVideo.layer.addSublayer(playerLayer);
    player.play();
Run Code Online (Sandbox Code Playgroud)

这是视频的容器(蓝色):

这是观点:

约束: 约束:

最后结果: 在此输入图像描述

我无法弄清楚为什么视频没有绑定到UIVIew坐标.如果我把它绑定到控制器的超级视图中,那就没关系.

alm*_*mas 28

当视图的帧发生变化时,子图层不会自动调整大小,您必须手动完成.您可以将UIView子类化以使其更容易.

class VideoContainerView: UIView {
  var playerLayer: CALayer?
  override func layoutSublayersOfLayer(layer: CALayer) {
    super.layoutSublayersOfLayer(layer)
    playerLayer?.frame = self.bounds
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中:

self.player = AVPlayer(URL: NSURL(fileURLWithPath: path!))
self.playerLayer = AVPlayerLayer(player: player);
self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
self.playerLayer.frame =  ctrVideo.bounds;
self.ctrVideo.layer.addSublayer(playerLayer);
self.ctrVideo.playerLayer = playerLayer;
player.play();
Run Code Online (Sandbox Code Playgroud)

只需确保将"ctrVideo"的类从UIView更改为VideoContainerView.

  • swift 3 的更新:`func layoutSublayersOfLayer(layer: CALayer)` 已更改为 `func layoutSublayers(of layer: CALayer) {}` (4认同)