我有一个带有渐变子视图的UICollectionViewCell
。
在我的视图控制器中,我有按钮正在排序CoreData,然后在reloadData()
上排序UICollectionView
。
为了避免我的渐变子视图一次又一次地被绘制(就像过去发生的那样),我在removeFromSuperview()
中实现了prepareForReuse()
。
在那里我还实现了一个跟踪渐变存在的标志,所以我仍然在加载单元格时添加一个新的渐变。
但是,删除渐变后,我的willMove(toSuperview: )
不起作用,并且不显示渐变视图。
我的逻辑出了什么问题?
class CollectionCell: UICollectionViewCell {
@IBOutlet weak var mealImg: UIImageView!
@IBOutlet weak var mealTitleLbl: UILabel!
@IBOutlet weak var gradientView: UIView!
var gradientWasRemoved = false
func configureCell(meal: Meal) {
mealTitleLbl.text = meal.title
let img = meal.getMealImage()
mealImg.image = img
addGradient()
}
func addGradient () {
let gradient = CAGradientLayer()
gradient.frame = gradientView.bounds
let topColor = UIColor(red:0.07, green:0.07, blue:0.07, alpha:1)
let botomColor = UIColor.clear
gradient.colors = [topColor.cgColor, botomColor.cgColor]
gradientView.layer.insertSublayer(gradient, at: 0)
if gradientWasRemoved == true {
gradientView.willMove(toSuperview: self)
}
}
override func prepareForReuse() {
super.prepareForReuse()
gradientView.removeFromSuperview()
gradientWasRemoved = true
}
}
答案 0 :(得分:0)
我能够通过以下方式修复逻辑。 在UICollectionViewCell类中:
import UIKit
class CollectionCell: UICollectionViewCell {
@IBOutlet weak var mealImg: UIImageView!
@IBOutlet weak var gradientView: UIView!
@IBOutlet weak var mealTitleLbl: UILabel!
var gradientWasRemoved = false
func configureCell(meal: Meal) {
mealTitleLbl.text = meal.title
let img = meal.getMealImage()
mealImg.image = img
addGradient()
}
func addGradient () {
let gradient = CAGradientLayer()
gradient.frame = gradientView.bounds
let topColor = UIColor(red:0.07, green:0.07, blue:0.07, alpha:1)
let botomColor = UIColor.clear
gradient.colors = [topColor.cgColor, botomColor.cgColor]
if gradientWasRemoved == false {
gradientView.layer.insertSublayer(gradient, at: 0)
} else if gradientWasRemoved == true {
self.addSubview(gradientView)
}
}
override func prepareForReuse() {
super.prepareForReuse()
gradientView.removeFromSuperview()
gradientWasRemoved = true
}
}
在prepareForReuse( )
我没有删除gradientView
,我将其从Superview中移除。我在那里设置了它已被删除的标志。
由于我没有nil
我的gradientView
我能够运行addGradient()
并访问gradientView.bounds
来创建新的CGGradientLayer
。
在向gradientView
添加新图层之前,我执行了if
检查。如果我们删除了gradientView
,那么我们就不会添加新的CGGradientLayer
,而只需将gradientView
放回去。
这样我们只将CGGradientLayer
添加到我们的gradientView中一次。
我了解到,通过从Superview删除视图,他们仍然活着并且可以进行编辑。
感谢@Luis和@LeoDabus的贡献。