渐变在 swift 中的集合视图中的单元格之间不断切换
gradient keeps switching between cells in collection view in swift
我的集合视图单元格有一个渐变背景,每个渐变都不同,具体取决于单元格的标签(例如,圣诞节是紫色渐变,生日是绿色渐变)但是当滚动集合视图时,渐变不断改变细胞。有没有办法解决这个问题?
这是我用来设置背景视图渐变的代码。它在 cellForItemAt
cell.mainView.setGradientBackground(colours: self.getColourFromTag(tag: self.lists[indexPath.item].tag))
.setGradientBackground
是 UIView 的扩展,它只是为背景设置渐变。此处显示:
func setGradientBackground(colours: [CGColor]) {
let gradientLayer = CAGradientLayer()
gradientLayer.frame = bounds
gradientLayer.colors = colours
gradientLayer.locations = [0.0, 1.0]
gradientLayer.startPoint = CGPoint(x: 1.0, y: 1.0)
gradientLayer.endPoint = CGPoint(x: 0.0, y: 0.0)
layer.insertSublayer(gradientLayer, at: 0)
}
我用下面的方法得到渐变中有哪些颜色
func getColourFromTag(tag: String) -> [CGColor] {
if tag == "Christmas" {
return [Colours.gradients.festive.start.cgColor, Colours.gradients.festive.end.cgColor]
}else if tag == "Birthday" {
return [Colours.gradients.lime.start.cgColor, Colours.gradients.lime.end.cgColor]
}else if tag == "Valentines Day" {
return [Colours.gradients.strawberry.start.cgColor, Colours.gradients.strawberry.end.cgColor]
}else if tag == "Charity" {
return [Colours.gradients.blueberry.start.cgColor, Colours.gradients.blueberry.end.cgColor]
}else if tag == "Event" {
return [Colours.gradients.fire.start.cgColor, Colours.gradients.fire.end.cgColor]
}else{
return [Colours.gradients.midnight.start.cgColor, Colours.gradients.midnight.end.cgColor]
}
}
我试过将每个 [颜色] 附加到一个数组中,然后将其放入 indexPath.item
的 .setGradientBackground
中,如下所示:
var colours = [[CGColor]]()
colours[indexPath.item] = self.getColourFromTag(tag: self.lists[indexPath.item].tag)
cell.mainView.setGradientBackground(colours: colours[indexPath.item])
但是,这不起作用,因为它超出了范围。有没有人有办法解决吗?谢谢。
阅读您在 setGradientBackground()
中的代码,您总是会初始化一个新的 CAGradientLayer
并将其插入单元格的最低位置。每次再次调用 setGradientBackground()
时,新的渐变图层将位于您已插入的所有其他渐变下方。
尝试从子图层中获取已经存在的 CAGradientLayer
并设置新颜色。
var gradientLayer = CAGradientLayer()
if let sublayers = layer.sublayers {
for sublayer in sublayers {
if let gLayer = sublayer as? CAGradientLayer {
gradientLayer = gLayer
break
}
}
}
gradientLayer.frame = bounds
gradientLayer.colors = colours
gradientLayer.locations = [0.0, 1.0]
gradientLayer.startPoint = CGPoint(x: 1.0, y: 1.0)
gradientLayer.endPoint = CGPoint(x: 0.0, y: 0.0)
layer.insertSublayer(gradientLayer, at: 0)
编辑
这是一个更 swift 的版本 (Swift 4.2),使用 compactMap()
获取 layer.sublayers
中的第一个现有渐变层:
if let existingLayer = (layer.sublayers?.compactMap { [=11=] as? CAGradientLayer })?.first {
gradientLayer = existingLayer
}
我的集合视图单元格有一个渐变背景,每个渐变都不同,具体取决于单元格的标签(例如,圣诞节是紫色渐变,生日是绿色渐变)但是当滚动集合视图时,渐变不断改变细胞。有没有办法解决这个问题?
这是我用来设置背景视图渐变的代码。它在 cellForItemAt
cell.mainView.setGradientBackground(colours: self.getColourFromTag(tag: self.lists[indexPath.item].tag))
.setGradientBackground
是 UIView 的扩展,它只是为背景设置渐变。此处显示:
func setGradientBackground(colours: [CGColor]) {
let gradientLayer = CAGradientLayer()
gradientLayer.frame = bounds
gradientLayer.colors = colours
gradientLayer.locations = [0.0, 1.0]
gradientLayer.startPoint = CGPoint(x: 1.0, y: 1.0)
gradientLayer.endPoint = CGPoint(x: 0.0, y: 0.0)
layer.insertSublayer(gradientLayer, at: 0)
}
我用下面的方法得到渐变中有哪些颜色
func getColourFromTag(tag: String) -> [CGColor] {
if tag == "Christmas" {
return [Colours.gradients.festive.start.cgColor, Colours.gradients.festive.end.cgColor]
}else if tag == "Birthday" {
return [Colours.gradients.lime.start.cgColor, Colours.gradients.lime.end.cgColor]
}else if tag == "Valentines Day" {
return [Colours.gradients.strawberry.start.cgColor, Colours.gradients.strawberry.end.cgColor]
}else if tag == "Charity" {
return [Colours.gradients.blueberry.start.cgColor, Colours.gradients.blueberry.end.cgColor]
}else if tag == "Event" {
return [Colours.gradients.fire.start.cgColor, Colours.gradients.fire.end.cgColor]
}else{
return [Colours.gradients.midnight.start.cgColor, Colours.gradients.midnight.end.cgColor]
}
}
我试过将每个 [颜色] 附加到一个数组中,然后将其放入 indexPath.item
的 .setGradientBackground
中,如下所示:
var colours = [[CGColor]]()
colours[indexPath.item] = self.getColourFromTag(tag: self.lists[indexPath.item].tag)
cell.mainView.setGradientBackground(colours: colours[indexPath.item])
但是,这不起作用,因为它超出了范围。有没有人有办法解决吗?谢谢。
阅读您在 setGradientBackground()
中的代码,您总是会初始化一个新的 CAGradientLayer
并将其插入单元格的最低位置。每次再次调用 setGradientBackground()
时,新的渐变图层将位于您已插入的所有其他渐变下方。
尝试从子图层中获取已经存在的 CAGradientLayer
并设置新颜色。
var gradientLayer = CAGradientLayer()
if let sublayers = layer.sublayers {
for sublayer in sublayers {
if let gLayer = sublayer as? CAGradientLayer {
gradientLayer = gLayer
break
}
}
}
gradientLayer.frame = bounds
gradientLayer.colors = colours
gradientLayer.locations = [0.0, 1.0]
gradientLayer.startPoint = CGPoint(x: 1.0, y: 1.0)
gradientLayer.endPoint = CGPoint(x: 0.0, y: 0.0)
layer.insertSublayer(gradientLayer, at: 0)
编辑
这是一个更 swift 的版本 (Swift 4.2),使用 compactMap()
获取 layer.sublayers
中的第一个现有渐变层:
if let existingLayer = (layer.sublayers?.compactMap { [=11=] as? CAGradientLayer })?.first {
gradientLayer = existingLayer
}