问题描述
我需要在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。。在handler
中创建一个CollectionViewCell
,并在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。。以handler
方法设置collectionView(_:cellForItemAt:)
的值
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])
}