AVPlayerLayer неправильно определяет размер - PullRequest
0 голосов
/ 23 октября 2018

У меня есть пользовательский UITableViewCell, который отображает либо изображение, либо видео.Если есть видео, оно первоначально загружает и отображает миниатюру из этого видео, пока видео загружается и готовится к воспроизведению.

Все это работает, проблема в том, что я получаю соотношение миниатюр, сохраняю их вбазы данных, и когда я загружаю миниатюру, она делает высоту на основе этого соотношения.Это прекрасно работает для изображений.Но проблема в том, что рамка AVPlayerLayer не покрывает весь эскиз, и выглядит это так:

enter image description here

Вот как я это делаю:

 func updateView() {

    if let videoUrlString = post?.videoUrl, let videoUrl = URL(string: videoUrlString) {
        volumeView.isHidden = false
        player = AVPlayer(url: videoUrl)
        playerLayer = AVPlayerLayer(player: player)
        playerLayer!.frame = postImageView.frame // thumbnail image
        playerLayer!.videoGravity = AVLayerVideoGravity.resizeAspectFill
        contentView.layer.addSublayer(playerLayer!)
        self.volumeView.layer.zPosition = 1
        layoutIfNeeded()
        player?.play()
        player?.isMuted = videoIsMuted
    }

    if let ratio = post?.ratio {
        photoHeightConstraint.constant = UIScreen.main.bounds.width / ratio
        layoutIfNeeded()
    }
 }

Я, кажется, что-то делаю неправильно, или что-то упускаю из-за моего окончательного результата.Любая подсказка?

ОБНОВЛЕНИЕ: Я заметил, что если вы прокручиваете ячейки медленно, видео отображается в соответствии с размером эскиза.Но если вы прокручиваете быстро, это не соответствует кадру.Я предполагаю, что это как-то связано с возможностью повторного использования или просто не может догнать кадр?Вот мой код для prepareForReuse() метода:

    override func prepareForReuse() {
    super.prepareForReuse()
    profileImageView.image = UIImage(named: "placeholder")
    postImageView.image = UIImage(named: "profile_placeholder")
    volumeView.isHidden = true
    if let p = player, let pLayer = playerLayer {
        p.pause()
        pLayer.removeFromSuperlayer()
    }
}

1 Ответ

0 голосов
/ 07 ноября 2018

Решение оказалось довольно простым.В основном каждый пост содержит либо пост, либо видео, но в любом случае он всегда содержит изображение.Я также установил ratio этого изображения (width, деленное на height).Итак, все, что мне нужно было сделать, это установить width для плеера на ширину экрана, деленную на соотношение, и это даст вам правильный кадр.

playerLayer.frame.size.height = UIScreen.main.bounds.width / postRatio
...