如何在UITableViewCell上使用CAGradientLayers

时间:2017-07-27 00:11:51

标签: ios swift uitableview uiview cagradientlayer

我遇到了在UITableViewCells上使用CAGradientLayers的问题。我试图做的是模拟actionsForRowAtIndexPath做什么,但我想使用自定义操作视图而不是仅设置背景颜色。

所以,我的行动计划是在我的UITableViewCell中,我已经在UIView(主要内容视图)下面隐藏了一个UIView(动作视图),它们都位于UITableViewCell的默认contentView中。

所以在我的' cellForRowAt' tableView函数,我有这段代码:

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath) as! CustomTableViewCell

    // Set Up Gradient
    let actionGradient = CUSTOM_GRADIENTS.blueToGreen!
    actionGradient.frame = cell.actionView.frame

    // Add Gradient to ActionView
    cell.actionView.insertSubLayer(actionGradient, at: 0)

    return cell
}

仅供参考我的CUSTOM_GRADIENTS是一个在ApplicationDelegate中初始化的类:

class safeGradiants {

    var blueToGreen: CAGradientLayer!

    init() {

        self.blueToGreen = CAGradientLayer()
        self.blueToGreen.colors = [UIColor.blue, UIColor.]
        self.blueToGreen.startPoint = CGPoint(x: 0.0, y: 0.5)
        self.blueToGreen.endPoint = CGPoint(x: 1.0, y: 0.5)
    }
}

发生错误的地方是加载我的tableView时,带有渐变的唯一单元格是表格视图中的最后一个单元格。我只能假设这与细胞的重复使用有关,但我不能为我的生活弄清楚如何解决它。

我需要做什么才能让所有细胞在actionView上显示这个渐变?

1 个答案:

答案 0 :(得分:0)

经过一番乱搞,我发现我的问题在于我的safeGradients类。由于我使用的是该类的一个全局实例,因此我无法重用相同的变量blueToGreen。

解决方法是创建一个类并拥有该类的一个全局实例,而不是创建一个承载子类函数的CAGradientLayer扩展。换句话说,我改变了这段代码:

class safeGradiants {

var blueToGreen: CAGradientLayer!

    init() {

        self.blueToGreen = CAGradientLayer()
        self.blueToGreen.colors = [UIColor.blue, UIColor.]
        self.blueToGreen.startPoint = CGPoint(x: 0.0, y: 0.5)
        self.blueToGreen.endPoint = CGPoint(x: 1.0, y: 0.5)
    }
}

进入此代码:

extension CAGradientLayer {

    class var blueToGreen: CAGradientLayer {
        let blueToGreen = CAGradientLayer()
        blueToGreen.colors = [UIColor.blue, UIColor.green]
        blueToGreen.startPoint = CGPoint(x: 0.0, y: 0.5)
        blueToGreen.endPoint = CGPoint(x: 1.0, y: 0.5)
        return blueToGreen
    }
}