【问题标题】:videoGravity resizeAspectFill doesn't work - Swift - AVFoundationvideoGravity resizeAspectFill 不起作用 - Swift - AVFoundation
【发布时间】:2020-07-12 13:34:42
【问题描述】:

我在 UIView 中显示视频,一切正常,视频层边界与嵌入它的 UIView 相同。

问题是视频在视图边界内没有正确显示,我只能看到它的一部分(正好是中心)。

所以我搜索并发现有一个 AVPlayerLayer 的属性应该可以解决这个问题:.videoGravity

我用 .resizeAspectFill 实现了它,但它并没有改变任何东西。

代码如下:

 class PlaceHolderVideoView : UIView{

  var player = AVPlayer()
  var playerLayer = AVPlayerLayer()
  let containerImageView = UIImageView(image: #imageLiteral(resourceName: "VideoContainerView"), contentMode: .scaleAspectFit)



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

setUpUI()

setUpPlayer()



}

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

fileprivate func setUpUI(){
clipsToBounds = true
translatesAutoresizingMaskIntoConstraints = false

addSubview(containerImageView)
containerImageView.clipsToBounds = true
containerImageView.fillSuperview()


}

fileprivate func setUpPlayer(){

let urlPathString = Bundle.main.path(forResource: "dance", ofType: "mp4")

if let videoURL = urlPathString{
    
    let url = URL(fileURLWithPath: videoURL)
    player = AVPlayer(url: url)
    playerLayer = AVPlayerLayer(player: player)
    playerLayer.cornerRadius = 20
    playerLayer.bounds = self.containerImageView.bounds
    print(self.containerImageView.bounds)
    playerLayer.videoGravity = .resizeAspectFill
    
    
    self.layer.masksToBounds = true
    self.layer.cornerRadius = 20
    self.layer.addSublayer(playerLayer)
    
    player.play()
    
    }
}
}

【问题讨论】:

  • 你试过.resizeAspect吗? .resizeAspectFill 实际上是裁剪视频以填充图层,仅显示中心部分。此外,请记住,当父层的大小发生变化时,子层不会自动调整大小。您需要相应地设置autoresizingMask
  • 我也尝试过 .resizeAspect 但它没有改变任何东西,你到底是什么意思与设置 autoresizingMask 相应? @FrankSchlegel
  • 哦,抱歉,刚刚意识到层 autoresizingMask 仅在 macOS 上可用。然后你需要在layoutSubviews 中更新playerLayer 的边界,例如通过再次运行playerLayer.bounds = self.containerImageView.bounds。否则,playerLayer 在其容器改变大小时不会改变大小。
  • 感谢@FrankSchlegel 的建议,但我尝试在 layoutSubviews 方法中设置播放器层边界,但它仍然没有改变任何东西。我猜容器视图的实际框架存在一些问题,但我不知道问题出在哪里,因为我认为在设置子视图框架时调用了布局子视图方法
  • @FrankSchlegel 我实际上发现了问题所在,我将在下面发布答案

标签: swift avfoundation avplayer avplayerlayer


【解决方案1】:

为了解决这个问题,我需要像这样调用 layoutSublayers 方法:

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

这个方法可以正确设置playerLayer的边界

【讨论】:

  • 嗨..我有完全相同的问题。我应用了您的解决方案,但没有奏效。您能否告诉您必须进行哪些更改才能解决此问题。这将非常有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多