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)

当我运行此代码时,只有表中的第一个条目具有渐变图层,其他单元格具有默认背景。我需要添加一些东西吗?

Missing background gradient color in table cells

答案

问题是当超视图的帧发生变化时,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 中设置水平渐变

GradientLayer 与 Swift 中的单元格标签重叠?

在 Swift 中的视图上添加渐变

swift中的CAGradientLayer相当于啥?

有角度的渐变层