根据 IndexPath 设置特定 CollectionView 单元格的背景颜色

Posted

技术标签:

【中文标题】根据 IndexPath 设置特定 CollectionView 单元格的背景颜色【英文标题】:Set Background Color of specific CollectionView Cells according to IndexPath 【发布时间】:2022-01-23 04:19:15 【问题描述】:

我对 Swift 和编程很陌生,很抱歉这个简单的问题:

我想开发一个使用(水平滚动的)UICollectionView 作为界面的日历。 UICollectionView 的每个单元格都应该有一个带有相应日期和工作日编号的标签。

为此,我有一个 dateArray 来存储日期对象。 setupCell- 方法是将各自的数据放到UICollectionViewCell 的标签上。

显示星期日的单元格应通过与其他单元格不同的背景颜色来突出显示。

我尝试在cellForItemAt - 方法中实现此功能,但卡在那里。

我的函数如下所示:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MyCollectionViewCell.identifier, for: indexPath) as! MyCollectionViewCell
        

        let dayFormatter = DateFormatter()
        let weekdayFormatter = DateFormatter()
        dayFormatter.dateFormat = "dd"
        weekdayFormatter.dateFormat = "EEE"

        cell.setupCell(day: dayFormatter.string(from: dateArray[indexPath.item]), weekday: weekdayFormatter.string(from: dateArray[indexPath.item]))

    
        
        if Calendar.current.component(.weekday, from: dateArray[indexPath.item]) == 1   
            cell.backgroundColor = UIColor.gray
        

        
        return cell
     

使用此功能,星期日会按计划突出显示,但前提是我不滚动。在最后滚动一些单元格后,所有单元格都将突出显示。

感谢您提供解决问题的每一个提示。

【问题讨论】:

【参考方案1】:

UICollectionViewCells 正在重复使用。因此名称为dequeueReusableCell。这意味着,例如,索引0 处的单元格与索引30 处的单元格相同。当您将索引0 处的单元格颜色设置为UIColor.gray 时,30 处的单元格也将是灰色的,除非您将其设置为另一种颜色。因为所有单元格都将被重复使用,并且所有单元格最终都会在某个时候成为“星期天”,所以它们都会变成彩色的。

对此有一个简单的解决方法,不仅要为您想要的颜色设置颜色,还可以相反。

例如:

if Calendar.current.component(.weekday, from: dateArray[indexPath.item]) == 1 
    cell.backgroundColor = UIColor.gray
 else 
    cell.backgroundColor = UIColor.white

我自己之前没有尝试过,但似乎还有另一种方法可以实现这一点。您还可以在 UICollectionViewCell 本身中实现 ​​prepareForReuse() (docs) 方法。您可以通过将以下内容添加到单元格来做到这一点:

override func prepareForReuse() 
    super.prepareForReuse()
    backgroundColor = UIColor.white // Or set to another color you want

另一种方法是在您为单元格创建的setupCell() 中设置backgroundColor。每次重用单元格时都会调用它,因此这也可能是执行此操作的好地方。只需应用与上述相同的逻辑(如果星期日 -> 灰色,否则 -> 白色)。

【讨论】:

谢谢,完美答案+解释!

以上是关于根据 IndexPath 设置特定 CollectionView 单元格的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

给定 UITableViewCell 的 indexPath,加载该特定单元格

仅使用 shouldSelectItemAt indexPath 函数选择特定单元格

特定 UITableViewCell 的 indexPath 始终为 nil

TableView didSelectRowAt IndexPath 没有被调用

如何获取 NSMutableArray 的 indexPath 值?

如何在特定 indexpath.row 上显示自定义 tableviewcell