【问题标题】:Change Color of UICollectionViewCell on touch触摸时更改 UICollectionViewCell 的颜色
【发布时间】:2015-04-21 05:47:42
【问题描述】:

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

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

我最初可以使用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 不是这样做的方法,那是什么?

【问题讨论】:

    标签: ios swift uicollectionview uicollectionviewcell


    【解决方案1】:

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

    首先我会调用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
    }
    

    【讨论】:

    • reloadItemsAtIndexPaths 和 cellForItemAtIndexPath 的更改非常有效,如果在 didSelectItemAtIndexPath 中更改了背景,我可以在按下它时更改单元格的颜色.. 它不适用于 `if (cell.selected) 语句。单元格不响应我在 if cell selected 语句中告诉他们执行的任何操作
    【解决方案2】:

    您可以为UICollectionView 实现自己的触控手势识别器。见https://stackoverflow.com/a/15629234/1557276

    完成后,调用UICollectionView实例的-indexPathForItemAtPoint:方法,然后在-cellForItemAtIndexPath:返回的单元格中进行更改

    【讨论】:

      【解决方案3】:

      当您dequeueReusableCellWithReuseIdentifier 时,它可以向您返回一个新单元格。

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

      【讨论】:

      • 我正在使用dequeue 方法,因为我在使用cellForItemAtIndexPath 时遇到了一个可选的展开零错误。任何想法如何解决这一问题? @thelaws
      • 这大概是因为cellForItemAtIndexPath 将为屏幕外的单元格返回nil。在尝试设置单元格的背景颜色之前,您只需要正确检查 Optional 是否为 nil。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-27
        • 2013-05-28
        • 1970-01-01
        • 1970-01-01
        • 2012-09-19
        • 1970-01-01
        • 2020-02-20
        相关资源
        最近更新 更多