将 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
。您可以在单元格的init
或awakeFromNib
方法中执行此操作。
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