为什么UICollectionViewCells不会在屏幕外更新?

时间:2015-06-08 10:25:35

标签: ios swift uicollectionview uicollectionviewcell

我有UICollectionView以水平流布局显示自定义单元格;换句话说,一些内容被放置在屏幕边界之外。 另外,我有一个触发NSNotification的手势,导致我的细胞的某些元素(即主题)的颜色变化。除了屏幕边界外的单元格不会更新到新的颜色变化这一事实外,一切都很完美。有没有办法强制他们重绘?

NSNotification被解雇时调用的函数中,我尝试使用self.collectionView.reloadData()self.collectionView.setNeedsDisplay()self.collectionView.setNeedsLayout重新绘制集合视图,但无济于事。我尝试了自定义单元格类awakeFromNib()中列表的最后两个,但没有。

以下是我cellForItemAtIndexPath的代码:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
            let cell = popularCollectionView!.dequeueReusableCellWithReuseIdentifier("popular", forIndexPath: indexPath) as! PopularPainting
            cell.thumbnail.image = paintings[indexPath.row].paintingImage
            cell.name!.text = paintings[indexPath.row].paintingName
            cell.price!.setTitle(paintings[indexPath.row].paintingPrice, forState: UIControlState.Normal)
            if cell.isDark {
                cell.name!.textColor = UIColor(red: 205/255, green: 205/255, blue: 205/255, alpha: 1)
                cell.price!.setTitleColor(self.kPaleBlue, forState: .Normal)
                self.popularCollectionView.reloadData()
            }

            return cell
}

有什么建议吗?

注意:滚动到屏幕外的内容并重复更改主题的动作非常有效,所以我不知道是什么。

2 个答案:

答案 0 :(得分:5)

您认为集合视图中的每个项目都存在屏幕外的单元格是不正确的。事实上,表格视图和集合视图会重新使用在屏幕外滚动显示新单元格的单元格,因此只有一小部分单元格存在。

通知触发后,您可以致电reloadData。但是您需要确保collectionView:itemForRowAtIndexPath:的实现将正确配置随后在屏幕上滚动的单元格。这可能意味着在通知触发后保存属性中的状态更改,并在collectionView:itemForRowAtIndexPath:中配置单元格时检查该属性。

答案 1 :(得分:0)

要解决“无法使用cellForItemAtIndexPath:到达视图,但在屏幕上显示该视图之前无法回收”的问题,可以将视图初始化逻辑从collectionView:cellForItemAtIndexPath:移至{{1 }}。

例如,您最初的位置:

collectionView:willDisplayCell:forItemAtIndexPath:

您可以将其替换为:

override func collectionView(
    _ collectionView: UICollectionView,
    cellForItemAt indexPath: IndexPath
) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(
        withReuseIdentifier: self.reuseIdentifier,
        for: indexPath
    )
    // Initialize cell
    return cell
}

这可确保如果override func collectionView( _ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath ) -> UICollectionViewCell { return collectionView.dequeueReusableCell( withReuseIdentifier: self.reuseIdentifier, for: indexPath ) } override func collectionView( _ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath ) { // Initialize cell } 返回cellForItemAtIndexPath:,则该单元格将在下一次由nil正确初始化之前显示在屏幕上。