UIKit:如何将多个 CALayer 混合到一个视图层中?

Posted

技术标签:

【中文标题】UIKit:如何将多个 CALayer 混合到一个视图层中?【英文标题】:UIKit: How to mix several CALayers into one view layer? 【发布时间】:2021-03-07 20:12:06 【问题描述】:

我想将几个子层混合到一个层中。 如果我只是将我的修改分配给视图层,它就可以正常工作:

testView.layer.cornerRadius = 15.0
testView.layer.shadowColor = UIColor.yellow.withAlphaComponent(1.0).cgColor
testView.layer.shadowOpacity = 1.0
testView.layer.shadowRadius = 24.0
testView.layer.shadowOffset = .zero
testView.backgroundColor = .white

然后,我尝试了这个:

testView.layer.cornerRadius = 15.0
// sl1
let layer1 = CALayer()
layer1.shadowColor = UIColor.yellow.withAlphaComponent(1.0).cgColor
layer1.shadowOpacity = 1.0
layer1.shadowRadius = 24.0
layer1.shadowOffset = .zero
// sl2
let layer2 = CALayer()
layer2.shadowColor = UIColor.red.withAlphaComponent(1.0).cgColor
layer2.shadowOpacity = 1.0
layer2.shadowRadius = 24.0
layer2.shadowOffset = .zero
// sublayers
let layer = CALayer()
testView.layer.sublayers = [layer1, layer2]
testView.backgroundColor = .white

但现在这是我得到的结果

现在白色视图周围没有阴影。为什么会这样?

感谢您的帮助

【问题讨论】:

【参考方案1】:

您的代码的主要问题是您的所有层都没有任何大小。因此,例如,您看不到阴影,因为图层本身在左上角的大小为零,因此没有任何东西可以投射任何阴影。

您的工作是在创建图层后立即给它一个frame!通常这将与超层的bounds 相同。但是请记住,与视图不同的是,当视图或超层调整大小时,子层不会。因此,如果您不采取措施纠正该问题,子层可能会停止正确“适应”其超层。

【讨论】:

我现在明白了。谢谢你的回答!

以上是关于UIKit:如何将多个 CALayer 混合到一个视图层中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个委托添加到我的视图控制器?

如何将 UIView 添加到 CALayer

使 UIView 或 CALayer 变暗的最快方法(性能方面)

混合 OpenGL 和 UIKit

在 CALayer 上应用两个以上 CIFilter

iOS 混合 Spritekit 和 UIKit