videoGravity resizeAspectFill не работает - Swift - AVFoundation - PullRequest
2 голосов
/ 12 июля 2020

Я показываю видео внутри 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()
    
    }
}
}

1 Ответ

1 голос
/ 13 июля 2020

Чтобы решить эту проблему, мне нужно было вызвать метод layoutSublayers следующим образом:

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

этот метод может правильно установить границы playerLayer

...