触摸时更改 UICollectionViewCell 的颜色

Change Color of UICollectionViewCell on touch

我在集合视图中有一组单元格,我想让它们像按钮一样工作。

当我点击一个单元格时,我希望该单元格突出显示,然后更改颜色。

我最初可以使用 cellForItemAtIndexPath 方法设置 collectionViewCell 中 view.backgroundColor 的颜色。然而,与我认为这样做会起作用的相反:

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    let cell: ButtonCollectionCell = collectionView.dequeueReusableCellWithReuseIdentifier("ButtonCell", forIndexPath: indexPath) as! ButtonCollectionCell
    cell.cellBackgroundView.backgroundColor = UIColor.darkGrayColor()
}

颜色还是没变...

基本上我希望这些单元格的行为与按钮完全一样。我希望它们在我松开手指后在触摸时突出显示为浅灰色(它们最初是白色)我希望它们变成深灰色。

如果我再次触摸,我希望它们再次突出显示为浅灰色,然后再次变为白色。

如果 didSelectItemAtIndexPath 不是这样做的方法,那是什么?

您可以为 UICollectionView 实现自己的触摸手势识别器。参见

完成后,调用 UICollectionView 实例的 -indexPathForItemAtPoint: 方法,然后在 -cellForItemAtIndexPath:

返回的单元格中进行更改

当你dequeueReusableCellWithReuseIdentifier它可以return给你一个新的单元格。

改为使用 cellForItemAtIndexPath 获取该索引路径处的当前单元格。

我建议对您的代码进行一些更改,以帮助您解决错误。

首先,我会调用 cellForItemAtIndexPath 方法来获取您的 cell 而不是使用 dequeue 方法:

let cell = collectionView.cellForItemAtIndexPath(indexPath) as! ButtonCollectionCell

然后你应该在didSelectItemAtIndexPath方法中调用reloadItemsAtIndexPaths来重新加载单元格:

collectionView.reloadItemsAtIndexPaths([indexPath])

此外,您不应在 didSelectItemAtIndexPath 方法中更改背景,但在检查单元格是否被选中的 cellForItemAtIndexPath 方法中:

if(cell?.selected){
  //set your background-color
}else{
  //change color
}

把这行代码放在你的方法中:

collectionView.cellForItem(at: indexPath)?.backgroundColor = UIColor.cyan