代码之家  ›  专栏  ›  技术社区  ›  Rakesha Shastri

具有渐变的uitableviewcell在第一次重用单元格之前无法工作

  •  0
  • Rakesha Shastri  · 技术社区  · 6 年前

    我想添加一个渐变到自定义的一部分 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() 方法。但真正的高度和宽度似乎并没有反映,直到细胞的第一次重复使用。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Au Ris    6 年前

    选项1: 打电话给你的 addGradient() 从TableView的 willDisplayCell 委托方法。

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

    确保添加一次渐变。因为细胞重复使用 添加渐变() 可能在同一个手机上被叫过几次。所以最好将函数重命名为 addGradientfNeeded() 并相应地调整其逻辑。

    选择2:

    而不是加入你的梯度 willDisplay 方法,在单元格中添加渐变视图和层(一次),并且只更新渐变层的帧。

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

    选择3:

    创建 GradientView 类并将其添加到界面生成器中或以编程方式添加到单元格中,渐变将随着视图边框的更改而调整大小:

    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!)
        }
    }
    
        2
  •  0
  •   SWAT    6 年前

    TableViewCell还没有帧。您可以打印帧来检查,它将是零帧。

    将addGradientView方法移动到LayoutSubView覆盖。

    override func layoutSubviews() {
        super.layoutSubviews()
        addGradient()
    }
    

    编辑:

    我知道你已经提到它在layoutsubview中不起作用。我相信你调用方法的方式有问题。 下面的代码对我有效

    class GradientCell: UITableViewCell {
    
    
    override func layoutSubviews() {
        super.layoutSubviews()
        print(self.frame)
        addGradient()
    }
    
    func addGradient() {
        let gradient = CAGradientLayer()
        gradient.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.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)
        self.layer.addSublayer(gradient)
    }
    
    }
    

    enter image description here

    编辑2: 你最好把那辆车开到窗口去