关于ios:如何在UITableViewCell上使用CAGradientLayers

How to use CAGradientLayers on UITableViewCell

我在UITableViewCells上使用CAGradientLayers遇到问题。我试图做的是模拟actionsForRowAtIndexPath所做的事情,但是我想使用自定义动作视图,而不只是设置背景色。

因此,我的行动计划是在我的UITableViewCell中,我已将一个UIView(动作视图)布置在另一个UIView(主内容视图)下,而这两个UIView都位于UITableViewCell的默认contentView中。

因此,在我的" cellForRowAt" tableView函数中,我有以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
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中初始化的类:

1
2
3
4
5
6
7
8
9
10
11
12
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时,唯一具有渐变的单元格是表视图中的LAST CELL。我只能假定这与单元的重用有关,但是我无法终生弄清楚如何修复它。

我需要做什么才能在所有单元格的actionView上显示此渐变的任何想法?


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

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

1
2
3
4
5
6
7
8
9
10
11
12
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)
    }
}

变成这段代码:

1
2
3
4
5
6
7
8
9
10
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
    }
}