【问题标题】:gradient layer in Swift UITableViewSwift UITableView 中的渐变层
【发布时间】:2018-01-17 19:46:31
【问题描述】:

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


【解决方案1】:

问题在于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 的回答似乎也适用于这件事)。

【讨论】:

  • 我更喜欢你的回答,但据我所知,你能解释一下我的回答有什么问题吗? :D
  • @Jay 每次布局单元格时,您都会创建一个新图层并将其添加到现有图层中。我想通常它不会改变一个可见的问题,但即便如此它至少是多余的
  • @Jay 但是你还是第一个来的,我会给你一个赞成票,因为你的回答指向了正确的方向:-)
【解决方案2】:

为什么不将它添加到单元格的子类中?这样您也可以在 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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2019-12-27
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多