在自定义collectionview单元格中填充图像而不会闪烁

时间:2018-02-23 11:09:03

标签: ios swift uicollectionview uiimage uicollectionviewcell

我遇到了填充细胞的问题。当滚动速度非常快时,单元格会在找到正确的图像之前经过2-3张图像。我加载了一个包含1000个项目的JSON的数组,并使用它们中的URL来获取具有此扩展名的图像:

extension UIImageView {

func downloadedFrom(url: URL, contentMode mode: UIViewContentMode = .scaleAspectFill) {
    contentMode = mode
    URLSession.shared.dataTask(with: url) { data, response, error in
        guard
            let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
            let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
            let data = data, error == nil,
            let image = UIImage(data: data)
            else { return }
        DispatchQueue.main.async() {
            self.image = image
        }
        }.resume()
}
func downloadedFrom(link: String, contentMode mode: UIViewContentMode = .scaleAspectFill) {
    guard let url = URL(string: link) else { return }
    downloadedFrom(url: url, contentMode: mode)
}

除了上面的问题,这一切都很有效。但我也想知道是否有更好的方法来加载数组中的一些项目,然后在滚动时追加更多?我应该提一下,我的fetchData函数,还包含数组函数的追加。

非常感谢。

2 个答案:

答案 0 :(得分:0)

当滚动速度非常快时,2-3个图像正在发生变化,因为您可能正在使用dequeReusableCells函数,这意味着正在重复使用单元格。如您所述,您加载了一个包含1000个项目的数组。诀窍是使用分页首先获取10个或20个项目,然后滚动到底部获取下一个10或20。 为此,您可能需要调整API以满足您的要求。如果您正在使用集合视图,此功能将帮助您检测是否已到达集合视图的末尾,是时候获取下一个10或20个项目。

public func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath){}

答案 1 :(得分:0)

您可以覆盖此方法......

override func prepareForReuse() {
   super.prepareForReuse()

   //hide or reset anything you want hereafter, for example
   imgView.image = nil //whatever

}