Swift UITableView中的渐变层
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
当我运行此代码时,只有表中的第一个条目具有渐变图层,其他单元格具有默认背景。我需要添加一些东西吗?
答案
问题是当超视图的帧发生变化时,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的答案似乎也适用于此事)。
另一答案
为什么不将它添加到单元格的子类中?这样你也可以在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)
}
以上是关于Swift UITableView中的渐变层的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 UITableView 单元格的渐变子层没有正确显示?
在 UITableviewcell swift 中设置水平渐变