如何在 UITableViewCell 上使用 CAGradientLayers

Posted

技术标签:

【中文标题】如何在 UITableViewCell 上使用 CAGradientLayers【英文标题】:How to use CAGradientLayers on UITableViewCell 【发布时间】:2017-07-27 00:11:50 【问题描述】:

我在 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 加载时,唯一具有渐变的单元格是 table view 中的 LAST CELL。我只能假设这与细胞的重复使用有关,但我一生都无法弄清楚如何解决它。

关于我需要做什么才能让所有单元格的 actionView 上显示此渐变有什么想法吗?

【问题讨论】:

如果所有单元格都应用相同的渐变,最好在表格视图单元格的 awakeFromNib() 方法中执行此操作,而不是在 cellForRow 中执行此操作 不,我不能这样做,因为在调用 awakeFrom() 时未布置单元格尺寸。但我能弄明白! 【参考方案1】:

经过一番折腾,我发现我的问题出在我的 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
    

【讨论】:

以上是关于如何在 UITableViewCell 上使用 CAGradientLayers的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UITableViewCell 上使用 CAGradientLayers

如何在uitableviewcell swift上使用pushviewcontroller [重复]

如何在 iOS 13.3 上使用 xib 显示 UITableViewCell?

如何在 UITableViewCell 上添加 rss 图片

如何使用委托Objective c从UITableViewCell.xib创建到ViewController的segue?

如何在 UITableViewCell 上显示数组数据?