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 的回答似乎也适用于此)。