我的观点需要一个影子。我尝试使用视图的NSShadow
功能,但在滚动视图中使用它太慢了。我想尝试使用图层的阴影属性来希望提高性能。
在我的NSView.updateLayer()
方法中,我设置了以下属性:
layer.shadowOffset = CGSize(width: 0, height: -3)
layer.shadowRadius = 3
layer.shadowColor = NSColor.black().cgColor
layer.shadowOpacity = 0.3
没有显示阴影。我还尝试将NSView.wantsDefaultClipping
和CALayer.masksToBounds
设置为false
,但仍然没有阴影。
使用CALayer
阴影属性时为什么没有阴影?
答案 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
期间设置了阴影属性。