这是我第一次使用CollectionView。我有一个简单的按钮,该按钮重复了9次,因为我用字符串数组填充了它。我想更改第一个元素的背景色,但是我可以做到这一点,但是在Scroll上,我也得到了具有相同背景色的其他元素,我只希望第一个元素具有该背景色。这是我的代码
class HomeC: UIViewController,CollectionViewDelegate,UICollectionViewDataSource {
@IBOutlet weak var CategoriesView: UICollectionView!
var CategoryIndex = 0
var categoryTypes = ["All","General","Sports","Local Issues","Questions","Politics","Events","Advertise","Sell","Services"]
override func viewDidLoad() {
super.viewDidLoad()
CategoriesView.delegate = self
CategoriesView.dataSource = self
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return categoryTypes.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CategoriesCVC", for: indexPath) as! CategoriesCVC
cell.items.tag = indexPath.row
cell.items.setTitle(categoryTypes[indexPath.row], for: .normal)
if categoryTypes[indexPath.row] == "All" && indexPath.row == CategoryIndex {
cell.items.backgroundColor = UIColor(hexString: BlueBackground)
cell.items.setTitleColor(.white, for: .normal)
}
return cell
}
}
使用该代码,我的第一个元素“ All”具有适当的背景,但是如果我在collectionView上滑动,则其他元素也将具有蓝色背景。如何解决此问题?任何建议都很好。
答案 0 :(得分:3)
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CategoriesCVC", for: indexPath) as! CategoriesCVC
cell.items.tag = indexPath.row
cell.items.setTitle(categoryTypes[indexPath.row], for: .normal)
if categoryTypes[indexPath.row] == "All" && indexPath.row == CategoryIndex {
cell.items.backgroundColor = UIColor(hexString: BlueBackground)
cell.items.setTitleColor(.white, for: .normal)
} else {
// set your normal cell color here
cell.items.backgroundColor = UIColor(hexString: NormalCellColor)
cell.items.setTitleColor(.normalTitleColoe, for: .normal)
}
return cell
}
由于收集视图使用出队的单元格,因此它将使用旧的单元格背景。那是蓝色的。如果您在else块中还原单元格颜色,将解决您的问题
如果您想以更专业的方式做。在单元格prepareForReuse
上进行清理。
override open func prepareForReuse() {
super.prepareForReuse()
// Set your default background color, title color etc
}
答案 1 :(得分:1)
由于单元已被重用,因此需要提供默认值。最好的方法是在prepareForReuse
类下覆盖CategoriesCVC
方法。
override open func prepareForReuse() {
super.prepareForReuse()
cell.items.backgroundColor = UIColor.black //Any default BG color you are using when not selected
cell.items.setTitleColor(.red, for: .normal) //Any default Title color you are using when not selected
}
答案 2 :(得分:0)
这里不需要同时匹配 cellForItemAt 中的两个条件,其中任意一个就足够了。如果阵列按顺序固定,则只需写 indexPath.row == 0
;如果阵列的按钮标题名称固定,则需要匹配 categoryTypes[indexPath.row] == "All"
这个单一条件。参见下面的代码:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CategoriesCVC", for: indexPath) as! CategoriesCVC
cell.items.tag = indexPath.row
cell.items.setTitle(categoryTypes[indexPath.row], for: .normal)
if indexPath.row == 0 {
cell.items.backgroundColor = UIColor(hexString: BlueBackground)
cell.items.setTitleColor(.white, for: .normal)
} else {
cell.items.backgroundColor = UIColor(hexString: DefaultCellColor)
cell.items.setTitleColor(.defaultTitleColor, for: .normal)
}
return cell
}