AVPlayerLayer 大小不正确
AVPlayerLayer not sizing correctly
我有一个显示图像或视频的自定义 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()
}
}
事实证明,解决方案相当简单。基本上每个 post 包含 post 或视频,但无论哪种方式,它总是包含图像。我还设置了该图像的 ratio
(width
除以 height
)。所以,我所要做的就是将播放器的 width
设置为屏幕宽度除以比率,它会为您提供正确的框架。
playerLayer.frame.size.height = UIScreen.main.bounds.width / postRatio
我有一个显示图像或视频的自定义 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()
}
}
事实证明,解决方案相当简单。基本上每个 post 包含 post 或视频,但无论哪种方式,它总是包含图像。我还设置了该图像的 ratio
(width
除以 height
)。所以,我所要做的就是将播放器的 width
设置为屏幕宽度除以比率,它会为您提供正确的框架。
playerLayer.frame.size.height = UIScreen.main.bounds.width / postRatio