我正在使用集合视图在列表上显示gif。 现在在向上或向下滚动收集视图时面临单元可重用的问题。
像 itemA 一样位于列表的第一位置,而 itemB 则位于列表的第二位置。 但是当我在集合视图中滚动数据时。物品放错了地方。像某个时间项目A排在第五位,有时甚至在列表中的任何地方。 我知道我认为这是可重复使用的单元格的用途,但不知道该如何解决。 请帮助。
集合视图cellForItemAt
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "GifCell", for: indexPath as IndexPath) as? GifCell else {
fatalError()
}
if gifArr.count > 0 {
let urlString = self.gifArr[indexPath.row]
let url = URL(string: urlString)!
DispatchQueue.global().async {
let imageData = try? Data(contentsOf: url)
let imageData3 = FLAnimatedImage(animatedGIFData: imageData) // this is the 3rd pary library to show the gifs on UIimageview's
DispatchQueue.main.async {
cell.imageView.animatedImage = imageData3
cell.textLabel.text = String(indexPath.row)
}
}
}
return cell
}
答案 0 :(得分:1)
在GifCell
中,您可以实现prepareForReuse()
方法:
进行必要的清理,以准备再次使用该视图。
override func prepareForReuse() {
super.prepareForReuse()
imageView.animatedImage = nil
textLabel.text = ""
}
注意:
此时,每次调用cellForItemAt
方法时,都会重新加载url,因此以后,您可能希望找到一种方法来缓存图像,而不是继续重新加载图像。
答案 1 :(得分:0)
第一个解决方案:您可以缓存数据,每次检查是否存在时,请使用缓存。
您可以使用this link,但可以用礼物类型替换UIImage
!
或 试试这个,我没有测试
if let giftAny = UserDefaults.standard.value(forKey: "giftUrl") {
//cast giftAny to Data
// use cached gift
} else {
// cache gift
let giftData = try? Data(contentsOf: url)
UserDefaults.standard.setValue(giftData, forKeyPath: "giftUrl")
//use gift
}
第二个解决方案:请勿重复使用单元格
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = UICollectionViewCell(style: .default, reuseIdentifier:"Cell")
return cell
}
但是在这种情况下,如果您有很多单元,则不可避免的是内存泄漏。