ios - 视频放在集合视图中的图像顶部?
问题描述
我有一个集合视图,其中填充了视频或图像,基于从 firebase 获取的内容。
我遇到了这个问题,当我获取数据并添加到单元格时,一些单元格会在 [图像] 顶部添加一个视频。
我查看了下面找到的代码,但似乎看不到。找出问题出在哪里。
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "p1Item", for: indexPath) as! CollectionViewCell1
if postArray[indexPath.item].media[0].image != nil { //its an image
let date = ConvertDate(mediaTimestamp: postArray[indexPath.row].media[0].postNum!, isItForP3: false).getDate!
do {
cell.imageView.image = postArray[indexPath.item].media[0].image!
if postArray[indexPath.item].user.profileImageUrl != "" {
let url = URL(string: "\(postArray[indexPath.item].user.profileImageUrl)")
let data = try Data(contentsOf: url!)
if let profileImage = UIImage(data: data) {
cell.profImage.image = profileImage
cell.titleLabel.text = postArray[indexPath.item].user.username
cell.subtitleLabel.text = date
}
} else {
//I add a fake image here
cell.titleLabel.text = postArray[indexPath.item].user.username
cell.subtitleLabel.text = date
cell.profImage.image = UIImage(named: "media")
}
} catch {
print("need to add stuff to this catch")
}
} else { //its a video
let videoURL = postArray[indexPath.item].media[0].videoURL
let player = AVPlayer(url: videoURL! as URL)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = cell.bounds
cell.layer.addSublayer(playerLayer)
let date = ConvertDate(mediaTimestamp: postArray[indexPath.item].media[0].postNum!, isItForP3: false).getDate!
do {
if postArray[indexPath.item].user.profileImageUrl != "" {
let url = URL(string: "\(postArray[indexPath.item].user.profileImageUrl)")
let data = try Data(contentsOf: url!)
if let profileImage = UIImage(data: data) {
cell.profImage.image = profileImage
cell.titleLabel.text = postArray[indexPath.item].user.username
cell.subtitleLabel.text = date
}
} else {
//I add a fake profile image here
cell.titleLabel.text = postArray[indexPath.item].user.username
cell.subtitleLabel.text = date
cell.profImage.image = UIImage(named: "media")
}
} catch {
print("need to add stuff to this catch")
}
}
print("Completed: ", cell.imageView!)
return cell
}
我该如何解决?
解决方案
原因在这里
cell.layer.addSublayer(playerLayer)
您应该清除单元格,因为它已出队
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "p1Item", for: indexPath) as! CollectionViewCell1
cell.layer.sublayers.forEach {
if $0 is AVPlayerLayer {
$0.removeFromSuperlayer()
}
}
,你也不应该使用
let data = try Data(contentsOf: url!)
对于远程数据抓取,您可以使用SDWebImage
推荐阅读
- powershell - 如何使用 PowerShell Replace 正确替换给定文件中的多个字符串
- javascript - 为什么函数 showStar() 不能与 (Return) 一起使用,而不是根据行增加星数?
- python - 可更新的 tkinter 画布与 mainloop
- r - 在R中的ggplot中更改县的边框颜色
- python - 如何在 python (matplotlib) 中绘制二维圆锥?
- c - 使用 MPI_Type_struct 和 MPI_Bcast 在 C 中通信数据结构
- php - Symfony 表单数据未与自定义表单图像类型主题一起发送
- android - 滑动刷新后删除不更新 RecyclerView 的项目
- windows - 为什么在命令块内定义的环境变量值在块内不可见?
- java - 当主键为 UUID 时,JPA 2 合并正在插入而不是更新