更改CollectionView中选定单元格的颜色取决于条件

问题描述

我需要在CollectionView中为不同条件设置渐变单元格颜色。

enter image description here

条件是在ViewController中的didSelectItemAt方法中设置的:

    func collectionView(_ collectionView: UICollectionView,didSelectItemAt indexPath: IndexPath) {

        if cellNumbers[indexPath.item] == currentNumberGuess {
            updateNumberLabel()
}
    }

我设法更改了UICollectionViewCell中单元格的颜色:

class CollectionViewCell: UICollectionViewCell {

    private lazy var gradient: CAGradientLayer = {
        let gradientLayer = CAGradientLayer()
        gradientLayer.colors = [UIColor.systemGreen.cgColor,UIColor.green.cgColor]
        gradientLayer.startPoint = CGPoint(x: 0,y: 0)
        gradientLayer.endPoint = CGPoint(x: 1,y: 1)
        gradientLayer.frame = self.bounds
        return gradientLayer
    }()

    override var isSelected: Bool {
        didSet {
            if self.isSelected {
                self.layer.insertSublayer(self.gradient,at: 0)
                label.isHidden = true
            } else {
                self.gradient.removeFromSuperlayer()
            }
        }
    }

    
    @IBOutlet weak var label: UILabel!
}

但是我还需要根据cellNumbers [indexPath.item] == currentNumberGuess条件更改所选单元格的颜色。我该怎么做?

解决方法

尝试一下:

  1. 删除您的override var isSelected代码。
  2. gradient定义移至ViewController并使其变为函数:
private func getGradient(for cell: UICollectionViewCell) -> CAGradientLayer {
    let gradientLayer = CAGradientLayer()
    gradientLayer.colors = [UIColor.systemGreen.cgColor,UIColor.green.cgColor]
    gradientLayer.startPoint = CGPoint(x: 0,y: 0)
    gradientLayer.endPoint = CGPoint(x: 1,y: 1)
    gradientLayer.frame = cell.bounds

    return gradientLayer
}
  1. didSelectItemAt函数中更改颜色,您可以像这样获得单元格实例:
private var previousGradientLayer: CAGradientLayer?

func collectionView(_ collectionView: UICollectionView,didSelectItemAt indexPath: IndexPath) {
    if cellNumbers[indexPath.item] == currentNumberGuess {
        guard let cell = collectionView.cellForItem(at: indexPath) else { return }

        // Clear gradient of the previously selected cell
        self.previousGradientLayer?.removeFromSuperlayer()

        // Update previousGradientLayer to the new gradient
        self.previousGradientLayer = self.getGradient(for: cell)

        // Your code
        cell.layer.insertSublayer(self.previousGradientLayer!,at: 0)
        label.isHidden = true
    }
}
,

您可以使用 closure 进行处理。

1。。在handler中创建一个CollectionViewCell,并在isSelectedtrue时调用它,即

var handler: (()->(Bool))? 

override var isSelected: Bool {
    didSet {
        if self.isSelected {
            if let value = self.handler?(),value {
                self.layer.insertSublayer(self.gradient,at: 0)
                label.isHidden = true
            }
        } else {
            self.gradient.removeFromSuperlayer()
        }
    }
}

2。。以handler方法设置collectionView(_:cellForItemAt:)的值

func collectionView(_ collectionView: UICollectionView,cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell",for: indexPath) as! CollectionViewCell
    cell.handler = {
        return cellNumbers[indexPath.item] == currentNumberGuess
    }
    return cell
}

3。。在collectionView(_:didSelectItemAt:)中,将单元格重新加载到indexPath

func collectionView(_ collectionView: UICollectionView,didSelectItemAt indexPath: IndexPath) {
    collectionView.reloadItems(at: [indexPath])
}