11

我有一个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];

但这不起作用。

4

3 回答 3

22

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

let newLayer = CALayer() // your layer that you want at the back
view.layer.insertSublayer(newLayer, at: 0)
于 2018-04-12T17:14:44.657 回答
15

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

于 2013-06-22T00:55:36.173 回答
4

最简单的解决方案是不将渐变层插入为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您可以通过重新排列子层数组在其子层中对其进行排序。

于 2013-06-22T00:53:57.057 回答