【发布时间】:2018-11-20 13:20:32
【问题描述】:
我已经能够将我想要的渐变应用到我的 UICollectionViewCell 的 backgroundView。但每次我重新加载单元格时,它都会再次应用我的渐变,累积所有渐变。
首先这里是我的渐变方法:
static func setGradientWhite(uiView: UIView) {
let colorBottomWhite = UIColor(red:1.00, green:1.00, blue:1.00, alpha:0.30).cgColor
let colorTopWhite = UIColor(red:1.00, green:1.00, blue:1.00, alpha:0).cgColor
let gradientLayer = CAGradientLayer()
gradientLayer.colors = [ colorTopWhite, colorBottomWhite]
gradientLayer.locations = [ 0.0, 1.0]
gradientLayer.frame = uiView.bounds
uiView.layer.insertSublayer(gradientLayer, at: 0)
}
我知道我可以用更通用的方式来做,并改变我处理颜色的方式,但这不是重点,现在只是为了测试目的。
我试着这样称呼它:
override func awakeFromNib() {
super.awakeFromNib()
UIUtils.setGradientWhite(uiView: self)
}
渐变不会以这种方式累积,在 awakeFromNib 中,但是,动画没有完成,我只有一半的单元格应用了渐变。
如果我用这种方法来做:
override func layoutSubviews() {
super.layoutSubviews()
CATransaction.begin()
CATransaction.setDisableActions(true)
UIUtils.setGradientWhite(uiView: self)
CATransaction.commit()
}
渐变动画已正确完成,应用于整个视图,但是当单元格重新加载时,它会在前一个渐变的顶部应用一个新渐变,直到我再也看不到我的单元格(在这种情况下,这里的白色太多了)。
关于如何解决此问题的任何想法?
【问题讨论】:
-
因为重复使用而积累。相反,将代码保留在
awakFromNib(),但在override func layoutSubviews(),而不是保护if let gradientLayer = self.layers.first as? CAGradientLayer() { gradientLayer.bounds = self.bounds }。 -
任何为什么没有变量
didSetupGradient = false,添加渐变后将其设置为true,并将渐变添加代码放入if !didSetupGradient -
默认情况下,函数参数是按值传递的,而不是按引用传递的。因此,它不反映与实际的外部对象。尝试在“(uiView:inout UIView)”之前添加“inout”关键字。或添加返回类型并使用现有对象设置更新的对象。
标签: ios swift uicollectionviewcell cagradientlayer