繁体   English   中英

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

[英]Change color of selected cell in CollectionView depends on condition

我需要在 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 条件更改所选单元格的颜色。 我怎么能做到这一点?

尝试这个:

  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.CollectionViewCell创建一个handler ,当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.collectionView(_:cellForItemAt:)方法中设置handler的值

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM