[英]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.