CAGradientLayer 无法正常工作

Posted

技术标签:

【中文标题】CAGradientLayer 无法正常工作【英文标题】:CAGradientLayer is not working properly 【发布时间】:2017-02-26 00:24:03 【问题描述】:

我正在尝试创建一个具有渐变背景的 UITableViewCell。我不明白为什么,但 UITableView 的右侧有一个空白区域。我尝试通过设置纯色但结果没有改变。

这是我的 UITableViewCell 类。

class HomeTableViewCell: UITableViewCell 

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code

        let gl = CAGradientLayer()
        gl.frame = self.bounds
        //gl.colors = [UIColor.red.cgColor as CGColor, UIColor.red.cgColor as CGColor]
        gl.backgroundColor = UIColor.blue.cgColor
        self.layer.addSublayer(gl)
    

    override func setSelected(_ selected: Bool, animated: Bool) 
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    

它看起来像这样。 (蓝色的是表格行)

发生了什么?如果我从 XCode 设置背景,它会显示一切正常。它只是不适合屏幕尺寸。

【问题讨论】:

【参考方案1】:

问题是单元格以一种大小从笔尖出来,但随后在放入界面时调整大小。但是您的图层比单元格调整大小要早得多,并且当单元格调整大小时,图层不会调整大小。因此,该层的最终尺寸错误

这里的一个好方法是保留对渐变层的引用,并在 layoutSubviews 覆盖中调整层的大小:

class MyTableViewCell : UITableViewCell 

    var gl : CAGradientLayer?

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code

        let gl = CAGradientLayer()
        gl.frame = self.bounds
        gl.colors = [UIColor.red.cgColor, UIColor.blue.cgColor]
        gl.zPosition = -1
        self.layer.addSublayer(gl)
        self.gl = gl
    

    override func layoutSubviews() 
        super.layoutSubviews()
        self.gl?.frame = self.bounds
    

【讨论】:

我该怎么办? 我尝试在 cellForRowAt 方法中调用的方法中添加 CAGradientLayer。但结果没有改变。 如果你想在你的单元格子类中这样做,保留对渐变层的引用并将其框架设置为layoutSubviews 添加了示例代码和屏幕截图,显示它可以工作。

以上是关于CAGradientLayer 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

带有 CAShapeLayer 的 UIView 不显示 CAGradientLayer

为啥我不能在 ARC 中使用自定义颜色创建 CAGradientLayer?

在 UITableView 中滚动到顶部后,CAGradientLayer 位置错误。迅速

为啥我无法使用 CAGradientLayer 的掩码

UILabel 上的 CAGradientLayer 无法旋转

CAGradientLayer 不工作[重复]