macOS:没有显示CALayer阴影

时间:2016-07-24 04:24:25

标签: macos cocoa core-animation calayer nsview

我的观点需要一个影子。我尝试使用视图的NSShadow功能,但在滚动视图中使用它太慢了。我想尝试使用图层的阴影属性来希望提高性能。

在我的NSView.updateLayer()方法中,我设置了以下属性:

layer.shadowOffset = CGSize(width: 0, height: -3)
layer.shadowRadius = 3
layer.shadowColor = NSColor.black().cgColor
layer.shadowOpacity = 0.3

没有显示阴影。我还尝试将NSView.wantsDefaultClippingCALayer.masksToBounds设置为false,但仍然没有阴影。

使用CALayer阴影属性时为什么没有阴影?

3 个答案:

答案 0 :(得分:1)

您需要添加的内容是:

self.view.wantsLayer = true

我尝试运行以下代码;图层确实显示阴影:

let layer = CALayer()
layer.frame = CGRect(x: 50, y: 50, width: 100, height: 100)

layer.backgroundColor = NSColor.redColor().CGColor

layer.shadowOffset = CGSize(width: 0, height: -3)
layer.shadowRadius = 3
layer.shadowColor = NSColor.blackColor().CGColor
layer.shadowOpacity = 1.0 //Or: 0.3 as you originally have
self.view.wantsLayer = true
self.view.layer?.addSublayer(layer)

顺便说一句,你在下一行有一个拼写错误:

NSColor.black().cgColor

应该是:

NSColor.blackColor().CGColor

答案 1 :(得分:0)

我查看了CALayer.render(in:)的反汇编,看起来它正确访问了图层阴影属性。所以NSView可能会在每个绘制周期中用自己的图层阴影属性覆盖它们。最重要的是,您只能使用视图上的shadow属性为视图支持图层添加阴影。

我确实解决了我的滚动性能问题。我在滚动期间浏览了我的应用程序并发现在CGContextEndTransparencyLayer中创建阴影图像导致CPU出现峰值。

创建阴影有两个步骤。首先,必须基于上面像素的alpha通道计算阴影的路径。其次,应用高斯模糊以柔化阴影的边缘。

因为我知道阴影顶部的视图是完全不透明的,所以我知道路径将只是视图的边界。我可以通过设置图层的shadowPath属性跳过第一步。但不幸的是,图层的阴影属性被没有shadowPath属性的视图覆盖。

我的解决方案是创建一个容器视图,在内容视图下方绘制一个矩形阴影图像。此阴影图像创建一次并缓存,从而显着提高滚动性能。由于自动布局(特别是对齐矩形插图)的强大功能,可以使用容器视图而无需手动调整阴影。

您可以查看我的代码on GitHub

答案 2 :(得分:0)

NSView 在可预测的时间设置 CALayer 上的阴影相关属性,例如当 wantsLayer 设置为 true 以及将视图添加到超级视图时。在 NSView 之后设置图层阴影属性,阴影将可见。我在 resizeSubviews 期间设置了阴影属性。

相关问题