UICollectionViewCell的点击效果

前言

在UITableViewCell有一个属性selectionStyle,是一个没具有属性,取值如下

typedef NS_ENUM(NSInteger, UITableViewCellSelectionStyle) {
    UITableViewCellSelectionStyleNone,
    UITableViewCellSelectionStyleBlue,
    UITableViewCellSelectionStyleGray,
    UITableViewCellSelectionStyleDefault NS_ENUM_AVAILABLE_IOS(7_0)
};

在xib是这样选择的
UICollectionViewCell的点击效果_第1张图片

其要实现的效果是就是在cell点击的时候,显示一个选中效果,并且提供了几种可选值


UICollectionViewCell的点击效果_第2张图片

需求

但是在 UICollectionViewCell 并未提供这样的属性,一番百度之后发现在UICollectionView提供了一下代理方法

代理方法
// 相当于开关,允许其高亮,实现的时候返回`true`
func collectionView(_ collectionView: UICollectionView, 
shouldHighlightItemAt indexPath: IndexPath) -> Bool

// 是高亮时需要做的操作
func collectionView(_ collectionView: UICollectionView, 
didHighlightItemAt indexPath: IndexPath)

// 取消高亮的时候操作
func collectionView(_ collectionView: UICollectionView, 
didUnhighlightItemAt indexPath: IndexPath) 

目前的需求是是在高亮的时候,通过UICollectionView

func cellForItem(at indexPath: IndexPath) -> UICollectionViewCell?

方法获取到cell,然后改变其背景色为灰色,然后在取消高亮的时候恢复其原来的颜色白色

问题

在实现的过程中,发现没有起作用,经过断点调试,以及各种可能性的推断以及调试发现 可能性的原因是点击高亮和取消高亮的方法系统是接连调用,只看到最后的取消高亮的白色,所以给人一种并未起作用的错觉,不过这只是一种推断

解决

所以我想在取消高亮的方法进行一定的延时,使其高亮的颜色得以展示,然后在实现区取消高亮,目前是可以实现了,代码如下

 //MARK: cell点击选中
    func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {
        return true
    }
    
    func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath)
        cell?.backgroundColor = UIColor.cellSelectedBgColor
    }
    
    func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath)
        delay(0.25) {
            cell?.backgroundColor = UIColor.white
        }
    }

后续

  • 在网上查询这问题时,答案并不是很多,而且几乎没有起作用的,延时的方法是自己想出来的,如果有问题后续会更新博客
  • 还有就是网上有说这种设置会有类似复用问题,但是经过我测试,以及我目前的项目场景,即点击cell以后会跳转一个新的cell,并且点击完之后要恢复其本来的颜色,所以并未发现复用问题
  • 欢迎各位拍砖沟通

你可能感兴趣的:(UICollectionViewCell的点击效果)