在heightForRowAt IndexPath之后,UITableViewCell的层没有得到更新

时间:2017-09-21 00:37:49

标签: ios swift uitableview cagradientlayer heightforrowatindexpath

我正在改变每个TableViewCell的大小:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 60
}

然后,在自定义单元格类中,我将'gradientLayer'作为子图层插入到Cell的图层属性中:

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    ...
    gradientLayer.frame = self.layer.bounds
    layer.insertSublayer(gradientLayer, at: 0)
    ...
}

然而,渐变并没有填满整个细胞: enter image description here

有谁知道为什么会发生这种情况/如何解决?

谢谢。

3 个答案:

答案 0 :(得分:3)

如果您使用普通UITableViewCell

 override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 100.0
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath)

        // ...

        let gradient =  CAGradientLayer()
        gradient.frame = cell.contentView.frame
        gradient.colors = [UIColor.blue.cgColor, UIColor.yellow.cgColor]
        gradient.locations = [0.0, 1.0]
        cell.contentView.layer.insertSublayer(gradient, at: 0)

        // ...

        return cell
    }

您需要确保将渐变添加到contentView的图层。

这样就可以了。

如果您使用自定义UITableViewCell类:

现在,如果您使用的是自定义单元格类,则需要覆盖layoutSubviews()方法,如下所示:

override func layoutSubviews() {
    super.layoutSubviews()

    gradient.frame = contentView.frame
}

这可以确保您的渐变框架始终等于您的contentView框架。

您的自定义单元格类将如下所示:

class CustomTableCell: UITableViewCell {

    lazy var gradient : CAGradientLayer = {
        var gradient = CAGradientLayer()
        gradient.colors = [UIColor.blue.cgColor, UIColor.yellow.cgColor]
        gradient.locations = [0.0, 1.0]
        self.contentView.layer.insertSublayer(gradient, at: 0)
        return gradient
    }()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        // ...

    }

    override func layoutSubviews() {
        super.layoutSubviews()

        // ...

        gradient.frame = contentView.frame

        // ...

    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        // ...
    }


}

如果您有任何其他问题,请与我们联系!

答案 1 :(得分:0)

初始时的帧大小是您的单元格的默认帧,来自故事板或任何地方。它的高度不会超过60(除非匹配)因为单元格刚刚在init中创建而然后它将被调整大小。

您可以在那里添加图层,但可以在layoutSubviews中调整大小或使用约束来自动布局。如果这样做,渐变将以最终大小填充您的单元格。

答案 2 :(得分:0)

为什么会这样?我不知道。

但如果你将渐变放在tableview的override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 60 } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) let gradient: CAGradientLayer = CAGradientLayer() gradient.colors = [UIColor.blue.cgColor, UIColor.red.cgColor] gradient.frame = CGRect(x: 0.0, y: 0.0, width: cell.frame.size.width, height: cell.frame.size.height) cell.layer.insertSublayer(gradient, at: 0) return cell } 中,你会得到:

enter image description here

以下是代码:

lastConn