Swift UITableView中的渐变层

问题描述 投票:0回答:2

我想在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

swift uitableview gradient
2个回答
2
投票

问题是当超视图的帧发生变化时,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的答案似乎也适用于此事)。


1
投票

为什么不将它添加到单元格的子类中?这样你也可以在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)
}
© www.soinside.com 2019 - 2024. All rights reserved.