簡體   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