AVPlayerLayer неправильно определяет размер

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

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

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

 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 ответ

Решение

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

playerLayer.frame.size.height = UIScreen.main.bounds.width / postRatio
Другие вопросы по тегам