将 CAGradientLayer 应用于单元格时,如何将其中一个单元格的视图向前移动,使其不受渐变的影响?

Posted

技术标签:

【中文标题】将 CAGradientLayer 应用于单元格时,如何将其中一个单元格的视图向前移动,使其不受渐变的影响?【英文标题】:When applying CAGradientLayer to a cell, How can I bring one of the cells' views forward so it is not affected by the gradient? 【发布时间】:2015-01-11 06:38:39 【问题描述】:

我有一个表格视图单元格,里面有一个文本标签。我使用此代码对单元格应用了渐变:

if(cell.layer.sublayers.count == 2) 
            let gradientLayer = CAGradientLayer()
            gradientLayer.colors = [UIColor.clearColor().CGColor, UIColor(red: 0, green: 0, blue: 0, alpha: 1.0).CGColor]
            gradientLayer.locations = [0.6, 1.0]
            gradientLayer.frame = cell.bounds
            cell.layer.insertSublayer(gradientLayer, atIndex: UInt32(1))
        

单元格由一个图像视图和一个标签组成。我曾考虑将渐变添加到 imageView,但因为我在 imageView 中使用了视差效果,它会导致渐变在滚动时移出位置。

如何将标签放在 CAGradientLayer 应用的渐变前面?或者我怎样才能使标签不受渐变的影响?

【问题讨论】:

您是否从单元的实现外部将渐变应用到单元? 这是在 tableView(_:cellForRowAtIndexPath) 函数中 【参考方案1】:

为您的单元格创建一个子类并覆盖layerClass 方法,使其返回CAGradientLayer

然后不添加子层,而是直接将渐变添加到self.layer。您可以在单元格的initawakeFromNib 方法中执行此操作。

override class func layerClass() -> AnyClass 
    return CAGradientLayer.self


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

    let gradientLayer: CAGradientLayer = self.layer as CAGradientLayer
    gradientLayer.colors = [UIColor.clearColor().CGColor, UIColor(red: 0, green: 0, blue: 0, alpha: 1.0).CGColor]
    gradientLayer.locations = [0.6, 1.0]

【讨论】:

我对你说的“将渐变直接添加到self.layer”的部分感到困惑。我已经创建了 UITableCell 的子类,因为我创建了一个自定义单元格。每当我尝试访问insertSublayer 的第二个参数的图层时,都会出现运行时错误。如何在不使用insertSublayer 方法的情况下将渐变插入self.layer 只需将self.layer 转换为CAGradientLayer。请参阅我编辑的答案。如果您使用故事板或 .xib 文件,请改为在 awakeFromNib: 中添加渐变。

以上是关于将 CAGradientLayer 应用于单元格时,如何将其中一个单元格的视图向前移动,使其不受渐变的影响?的主要内容,如果未能解决你的问题,请参考以下文章

在laravel excel导出中将颜色应用于excel单元格时出错

如何将 CAGradientLayer 应用于 UINavigationController 背景

UICollectionViewCell - 将不同的 CAGradientLayer 应用于不同的 UIView

CAGradientLayer 未应用于整个屏幕

CAGradientLayer 不适用于 iOS 7(但适用于 iOS 6)

集合视图中单元格的宽度不正确