У меня есть пользовательский 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()
}
}