CAGradientLayer 发送到后面

Posted

技术标签:

【中文标题】CAGradientLayer 发送到后面【英文标题】:CAGradientLayer send to back 【发布时间】:2013-06-22 00:34:51 【问题描述】:

我有一个UIViewController,我用

创建了一个背景渐变
    CAGradientLayer *gradient = [CAGradientLayer layer];
    ...
    gradient.frame = frame;
    self.backGradient = gradient;
    [self.view.layer insertSublayer:gradient atIndex:0];

它工作正常,稍后我必须将我的视图控制器的子视图_selectionFrame 发送到后面:(我经常需要将_selectionFrame 发送到后面和前面,用于动画和绘图目的)

self 是视图控制器:

[self.view sendSubviewToBack:_selectionFrame]; 

但是,这会将_selectionFrame 发送到gradient 后面。我希望它在渐变上方但在其他所有子视图下方。问题是渐变不是视图,所以我不能使用渐变的函数。 我想打电话给[self.view sendSubviewToBack:gradient];

但这不起作用。

【问题讨论】:

【参考方案1】:

.layer 有一个 sublayers 属性,它是一个简单的数组。所以你可以在你想要的任何索引处插入。如果你想让你的新层在后面,只需在 0 处插入即可,如下所示:

let newLayer = CALayer() // your layer that you want at the back
view.layer.insertSublayer(newLayer, at: 0)

【讨论】:

这个是我认为最准确的 这可行,但不能像 insertSublayer 那样覆盖整个视图.. :( 我不确定我是否在关注你。有什么问题?【参考方案2】:

创建一个只包含渐变的视图

【讨论】:

【参考方案3】:

最简单的解决方案是不插入渐变层作为self.view.layer的子层。相反,它应该self.view.layer。 UIView 子类有一个类方法layerClass,可以让你说出它的层应该是什么类。

例如,在您的 UIView 子类中,您可以添加:

override class var layerClass: AnyClass 
    return CAGradientLayer.self

并且当在视图中引用self.layer 时,将其包装成一个守卫 let 或 if let 以像这样转换类型:

guard let layer = self.layer as? CAGradientLayer else  ... 

或者,它可能self.view 的某个其他子视图的层,再次使用相同的类方法layerClass 轻松排列。

否则,您将不得不使用层命令,而不是查看命令来对self.view 的子层进行排序。这包括它的子视图。换句话说,如果vself.view 的子视图,那么v.layerself.view.layer 的子层,您可以通过重新排列子层数组在其子层中对其进行排序。

【讨论】:

self.view.layer = self.backGradient;不起作用 self.view.layer 是只读的 你没有看我说的。您必须使用自定义 UIView 并实现 layerClass,以便 UIView 以 CAGradientLayer 作为其层“诞生”。 感谢有趣,但比必要的复杂(对我来说) 谢谢!这是最终为我解决这个问题的唯一答案。我认为这方面的一些代码示例将极大地帮助其他人使用此解决方案,因此我将建议使用示例进行编辑 @bplattenburg 好编辑,我刚刚清理了代码格式。

以上是关于CAGradientLayer 发送到后面的主要内容,如果未能解决你的问题,请参考以下文章

CAGradientLayer 在 UITableView backgroundColor 上不起作用

Python:计算需要从数据框中分组的值的 5 年滚动 CAGR

如何将 CAGradientLayer 添加到 CAShapeLayer?

使用编程约束时如何将 CAGradientLayer 添加到 UIView

iOS - 将 CAGradientLayer 集中到父 UIView

如何将 CAGradientLayer 添加到 UIButton