gpt4 book ai didi

ios - 具有渐变的 UITableViewCell 在第一次重用单元格之前不起作用

转载 作者:搜寻专家 更新时间:2023-11-01 07:00:47 24 4
gpt4 key购买 nike

我想为自定义 UITableViewCell 的一部分添加渐变。这是我的渐变代码。

func addGradient() {
gradient = CAGradientLayer()
gradient.frame = CGRect(x: 0, y: 0, width: gradientView.frame.width, height: gradientView.frame.height)
gradient.colors = [
UIColor(red:0.23, green:0.24, blue:0.28, alpha:1).cgColor,
UIColor(red:0.11, green:0.11, blue:0.12, alpha:0.6).cgColor
]
gradient.locations = [0, 1]
gradient.startPoint = CGPoint(x: 0.5, y: 0)
gradient.endPoint = CGPoint(x: 0.5, y: 1)
gradientView.layer.addSublayer(gradient)
}

这是我的 gradientView 代码。

func addGradientView() {
containerView.addSubview(gradientView)

gradientView.translatesAutoresizingMaskIntoConstraints = false
gradientView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor).isActive = true
gradientView.topAnchor.constraint(equalTo: barChart.bottomAnchor).isActive = true
gradientView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor).isActive = true
gradientView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true
}

addGradient()layoutSubiviews() 方法中被调用。但真正的高度和宽度似乎直到第一次重用单元格才反射(reflect)出来。

最佳答案

选项 1:从 tableview 的 willDisplayCell 委托(delegate)方法调用您的 addGradient()

public func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if cell is YourCustomTableViewCell {
(cell as! YourCustomTableViewCell).addGradient()
}
}

确保添加一次渐变。由于单元格重用 addGradient() 可能会在同一单元格上多次调用。因此,最好将您的函数重命名为 addGradientfNeeded() 并相应地调整其逻辑。

选项 2:

不是在 willDisplay 方法中添加渐变,而是在单元格中添加渐变 View 和图层(一次),并且只更新渐变图层的框架。

public func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if cell is YourCustomTableViewCell {
(cell as! YourCustomTableViewCell).updateGradientLayerFrame()
}
}

选项 3:

创建一个 GradientView 类并将其添加到界面构建器中或以编程方式添加到您的单元格中,渐变将随着 View 框架的变化而调整大小:

public class GradientView: UIView {
private var gradientLayer: CAGradientLayer?

override public func layoutSubviews() {
super.layoutSubviews()

guard gradientLayer == nil else {
gradientLayer?.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height)
return
}

gradientLayer = CAGradientLayer()
gradientLayer!.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height)
gradientLayer!.colors = [
UIColor(red:0.23, green:0.24, blue:0.28, alpha:1).cgColor,
UIColor(red:0.11, green:0.11, blue:0.12, alpha:0.6).cgColor
]
gradientLayer!.locations = [0, 1]
gradientLayer!.startPoint = CGPoint(x: 0.5, y: 0)
gradientLayer!.endPoint = CGPoint(x: 0.5, y: 1)
self.layer.addSublayer(gradientLayer!)
}
}

关于ios - 具有渐变的 UITableViewCell 在第一次重用单元格之前不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51277566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com