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
的子层进行排序。这包括它的子视图。换句话说,如果v
是self.view
的子视图,那么v.layer
是self.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