我在UICollectionView中的自定义单元格上显示复选标记时遇到问题。对于前几个水龙头,一切都按预期工作,但是当我开始重复滚动或点击或点击已经选择的单元格时,行为变得奇怪,如gif中所示。也许我会以不正确的方式解决这个问题? .addCheck()和.removeCheck()是我制作的自定义UICollectionViewCell类中的方法,他们所做的只是添加一个复选标记图像或从单元格视图中删除一个。 The odd behavior shown here
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! ColorUICollectionViewCell
// Configure the cell
let color = colorList[(indexPath as NSIndexPath).row]
cell.delegate = self
cell.textLabel.text = color.name
cell.backgroundColor = color.color
if color.selected {
cell.addCheck()
}
else {
cell.removeCheck()
}
return cell
}
// user selects item
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// set colors to false for selection
for color in colorList {
color.selected = false
}
// set selected color to true for selection
let color = colorList[indexPath.row]
color.selected = true
settings.backgroundColor = color.color
//userDefaults.set(selectedIndex, forKey: "selectedIndex")
collectionView.reloadData()
}
下面是我的自定义单元格中的addCheck()和removeCheck()函数的样子。
func addCheck() {
// create check image
let checkImage = UIImage(named: "checkmark")
checkImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: bounds.size.height / 4, height: bounds.size.height / 4))
checkImageView.image = checkImage!.withRenderingMode(UIImageRenderingMode.alwaysTemplate)
checkImageView.tintColor = UIColor.white()
// add the views
addSubview(checkImageView)
}
func removeCheck() {
if checkImageView != nil {
checkImageView.removeFromSuperview()
}
}
答案 0 :(得分:1)
首先,您可以简化您的didSelect:
override func collectionView(collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// set colors to false for selection
for (index, color) in colorList.enumerate() {
if index == indexPath.row {
color.selected = false
settings.backgroundColor = color.color
}
else {
color.selected = false
}
}
collectionView.reloadData()
}
根据您的cellForItemAt方法中的语言,当您点击同一个单元格两次时,我猜测您正在添加第二个复选标记图像,而且它没有被正确跟踪,因此单元格不断加速旋转,集合视图重新加载
发布您的单元格类,或者至少是addCheck和removeCheck的逻辑,我们可能会发现问题。
我建议永久使用带有复选标记的imageView,当根据选择显示/隐藏它时。这也应该加快collectionView的速度。