首页 > 解决方案 > 更改 CollectionView 中选定单元格的颜色取决于条件

问题描述

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

在此处输入图像描述

条件是在 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 条件。我怎么能这样做?

标签: iosswiftuicollectionview

解决方案


尝试这个:

  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
    }
}

推荐阅读