【问题标题】:macOS: CALayer shadow not showingmacOS:CALayer 阴影未显示
【发布时间】:2016-07-24 04:24:25
【问题描述】:

我的视野需要一个阴影。我尝试使用视图的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阴影属性时没有阴影?

【问题讨论】:

    标签: swift cocoa core-animation calayer nsview


    【解决方案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
    

    【讨论】:

    • 谢谢!但我专门讨论的是视图支持层,而不是独立层。此外,.cgColor 不是 Swift 3 中的错字。:-)
    【解决方案2】:

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

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

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

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

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

    您可以查看我的代码on GitHub

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-21
        • 1970-01-01
        • 2016-11-10
        • 2020-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多