根据 IndexPath 设置特定 CollectionView Cells 的背景颜色
Set Background Color of specific CollectionView Cells according to IndexPath
我对 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
}
使用此功能,星期日会按计划突出显示,但前提是我不滚动。在最后滚动后,所有单元格都将突出显示。
感谢您提供的解决问题的所有提示。
UICollectionViewCell
正在重用。因此得名 dequeueReusableCell
。这意味着,例如,索引 0
处的单元格与索引 30
处的单元格相同。当您将索引 0
处的单元格颜色设置为 UIColor.gray
时,30
处的单元格也将是灰色,除非您将其设置为其他颜色。因为所有的cell都要被重复使用,而且所有的cell最终都会在某个时候成为“星期天”,所以它们都会变成彩色的。
这个问题有一个简单的解决方法,不仅要为你想要的颜色设置颜色,还要反其道而行之。
例如:
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
。每次重用单元格时都会调用它,因此这也是执行此操作的好地方。只需应用与上述相同的逻辑(如果星期日 -> 灰色,否则 -> 白色)。
我对 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
}
使用此功能,星期日会按计划突出显示,但前提是我不滚动。在最后滚动后,所有单元格都将突出显示。
感谢您提供的解决问题的所有提示。
UICollectionViewCell
正在重用。因此得名 dequeueReusableCell
。这意味着,例如,索引 0
处的单元格与索引 30
处的单元格相同。当您将索引 0
处的单元格颜色设置为 UIColor.gray
时,30
处的单元格也将是灰色,除非您将其设置为其他颜色。因为所有的cell都要被重复使用,而且所有的cell最终都会在某个时候成为“星期天”,所以它们都会变成彩色的。
这个问题有一个简单的解决方法,不仅要为你想要的颜色设置颜色,还要反其道而行之。
例如:
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
。每次重用单元格时都会调用它,因此这也是执行此操作的好地方。只需应用与上述相同的逻辑(如果星期日 -> 灰色,否则 -> 白色)。