ios - iOS - 如何将渐变颜色应用于 UICollectionViewCell backgroundView?
问题描述
我已经能够将我想要的渐变应用到我的 UICollectionViewCell 的背景视图。但是每次我重新加载单元格时,它都会再次应用我的渐变,累积所有渐变。
首先这里是我的渐变方法:
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()
}
渐变动画已正确完成,应用于整个视图,但是当单元格重新加载时,它会在前一个渐变的顶部应用一个新的渐变,直到我再也看不到我的单元格(在这种情况下,这里的白色太多了)。
关于如何解决这个问题的任何想法?
解决方案
你可以试试
override func layoutSubviews() {
super.layoutSubviews()
if !(self.layer.sublayers?.first is CAGradientLayer) {
CATransaction.begin()
CATransaction.setDisableActions(true)
UIUtils.setGradientWhite(uiView: self)
CATransaction.commit()
}
}
推荐阅读
- jquery - 将 ajaxstop 与 sweetalert2 一起使用的最佳方式
- javascript - Jquery自动完成:如何防止选择重复
- c - 通过指针访问相同的结构或将结构存储在局部变量中?
- c# - MEF ImportMany 接口的第一个实现屏蔽了任何后续实现
- c# - 如何使用 Unity 2019.1.0f2 中的动画修复音高偏移的不一致
- swift - 如何在字符串中查找子字符串,然后使用函数打印子字符串之后的所有内容
- css - 仅将线性渐变动画应用于网格/网格叠加
- python - 使用python从终端读取字符串
- c# - 如何使用 MVVM 架构在 WPF 中实现简单的树形数据结构?
- android - 如何在 android demo 上的 tensorflow 对象检测 api 中使用前置摄像头