Swift UITableView 中的渐变层
gradient layer in Swift UITableView
我想在 Swift 中的 UITableView 的每一行中创建一个渐变背景图层。在 cellForRowAt 函数中,我有这段代码来绘制渐变层。
guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? PlayerTableViewCell else { fatalError("The dequeued cell is not an instance of PlayerTableViewCell") }
// set background color for the cell
let newLayer = CAGradientLayer()
newLayer.colors = [UIColor.black.cgColor, UIColor.darkGray.cgColor ]
newLayer.frame = cell.frame
cell.layer.addSublayer(newLayer)
cell.layer.insertSublayer(newLayer, at: 0)
当我运行这段代码时,只有table中的第一个条目有渐变层,其他单元格有默认背景。
我需要添加什么吗?
Missing background gradient color in table cells
为什么不在单元格的子类中添加呢?这样您也可以在 prepareForReuse 中删除它,这样您就不会在单元格中添加倍数?
var newLayer:CAGradientLayer!
override func layoutSubviews() {
super.layoutSubviews()
//Code to insert the gradient here.
newLayer = CAGradientLayer()
newLayer.frame = contentView.frame
newLayer.colors = [UIColor.black.cgColor, UIColor.darkGray.cgColor ]
contentView.layer.insertSublayer(newLayer, at: 0)
}
问题是当父视图的框架改变时,gradientLayer
不会更新它的边界——所以当父视图改变它的框架时,gradientLayer
仍然会保持相同的边界。您需要在 layoutSubviews
.
中更新其边界
我会接受@Jay 的回答,但那里有一些问题:
var gradientLayer: CAGradientLayer = CAGradientLayer()
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
// insert it only once
gradientLayer.colors = [UIColor.black.cgColor, UIColor.darkGray.cgColor ]
contentView.layer.insertSublayer(gradientLayer, at: 0)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
super.layoutSubviews()
// here we just need to update the frame
gradientLayer.frame = contentView.frame
}
我已经测试过了,它工作得很好(好吧,@Jay 的回答似乎也适用于此)。
我想在 Swift 中的 UITableView 的每一行中创建一个渐变背景图层。在 cellForRowAt 函数中,我有这段代码来绘制渐变层。
guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? PlayerTableViewCell else { fatalError("The dequeued cell is not an instance of PlayerTableViewCell") }
// set background color for the cell
let newLayer = CAGradientLayer()
newLayer.colors = [UIColor.black.cgColor, UIColor.darkGray.cgColor ]
newLayer.frame = cell.frame
cell.layer.addSublayer(newLayer)
cell.layer.insertSublayer(newLayer, at: 0)
当我运行这段代码时,只有table中的第一个条目有渐变层,其他单元格有默认背景。 我需要添加什么吗?
Missing background gradient color in table cells
为什么不在单元格的子类中添加呢?这样您也可以在 prepareForReuse 中删除它,这样您就不会在单元格中添加倍数?
var newLayer:CAGradientLayer!
override func layoutSubviews() {
super.layoutSubviews()
//Code to insert the gradient here.
newLayer = CAGradientLayer()
newLayer.frame = contentView.frame
newLayer.colors = [UIColor.black.cgColor, UIColor.darkGray.cgColor ]
contentView.layer.insertSublayer(newLayer, at: 0)
}
问题是当父视图的框架改变时,gradientLayer
不会更新它的边界——所以当父视图改变它的框架时,gradientLayer
仍然会保持相同的边界。您需要在 layoutSubviews
.
我会接受@Jay 的回答,但那里有一些问题:
var gradientLayer: CAGradientLayer = CAGradientLayer()
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
// insert it only once
gradientLayer.colors = [UIColor.black.cgColor, UIColor.darkGray.cgColor ]
contentView.layer.insertSublayer(gradientLayer, at: 0)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
super.layoutSubviews()
// here we just need to update the frame
gradientLayer.frame = contentView.frame
}
我已经测试过了,它工作得很好(好吧,@Jay 的回答似乎也适用于此)。