UICollectionView 的奇怪行为

Posted

技术标签:

【中文标题】UICollectionView 的奇怪行为【英文标题】:Weird behaviour of UICollectionView 【发布时间】:2016-12-14 12:05:11 【问题描述】:

正如您在附加的 GIF 中看到的那样,UICollectionView 工作正常,但单元格中的图像不稳定(首先您看到一个图像,然后图像变为正确的图像)。

GIF 示例: http://d.pr/i/ZccO

刷新触发器:

self?.productsCollectionView.reloadData()

创建每个单元格的collectionView函数:

    // make a cell for each cell index path
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    // Check if need to load more battles
    if indexPath.item + Constants.bufferToLoad >= (Constants.pageSize * self.page) && Constants.pageSize * self.page < self.totalProducts 
        self.page += 1
        self.getProducts(false)
    
    var cell:UICollectionViewCell?
    if self.isLoading && indexPath.item == self.products.count-1 
        cell = collectionView.dequeueReusableCellWithReuseIdentifier(Constants.loadigCell, forIndexPath: indexPath) as? LoadingCollectionViewCell
        (cell as! LoadingCollectionViewCell).activityView.startAnimating()
     else 
        cell = collectionView.dequeueReusableCellWithReuseIdentifier(Constants.cellName, forIndexPath: indexPath) as? SavedProductCollectionViewCell
        let productCell = cell as! SavedProductCollectionViewCell
        productCell.product = self.products[indexPath.item]
    

    return cell!

这是我为每个 CollectionViewCell 设置图像的方式:

    var product:Product! 
    didSet 
        self.updateUI()
    

override func awakeFromNib() 
    super.awakeFromNib()
    self.layer.cornerRadius = 5
    self.layer.masksToBounds = true


func updateUI() 
    self.productImage.loadImageFromURLString(self.product.mainImage!,placeholderImage: UIImage(named: "placeHolder"))
    self.productNameLabel.text = self.product?.name
    self.productPriceLabel.text = self.product?.price
    self.setPicks()

【问题讨论】:

您在 GIF 上看到的是可重复使用的单元格在实践中的工作方式。 【参考方案1】:

细胞被重复使用。当一个重用单元被返回时,它仍然会包含旧图像,直到新图像的加载完成。您应该将图像设置为nilcellForItemAtIndexLath 或单元格的prepareForReuse 方法中的某个占位符图像。

override func prepareForReuse() 
   self.productImage = nil
   self.productNameLabel.text = ""
   self.productPriceLabel.text = ""

【讨论】:

嘿嘿,但是我之前看到的图片不是cell的旧图,每次刷新都会出现 单元格不会以相同的顺序重复使用,因此您得到的是旧图像,不一定是之前在该位置的图像 你能写一个你推荐我添加的代码sn-p吗?我试图将 productImage 设置为 null,但发生了同样的奇怪行为 您的代码 sn-p 返回一个错误,因为“loadImageFromURLString”不适用于 nil,self.productImage.image = nil 不会返回错误,但问题是一样的

以上是关于UICollectionView 的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 单元格高度/可滚动内容行为奇怪/不正确

启用分页和每页多个单元格时奇怪的 UICollectionView 行为

UIcollectionView奇怪的细胞回收行为

在 UICollectionView 中使用 reloadData 时如何从重新加载中排除标头

UITableViewCell 内的 UICollectionView 滚动行为

UICollectionViewDelegate 的奇怪行为