[英]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 條件更改所選單元格的顏色。 我怎么能做到這一點?
嘗試這個:
override var isSelected
代碼。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
}
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
,當isSelected
為true
時調用它,即
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.