在 NSView 上使用自定义影子路径

Using custom shadow path on NSView

提问人:Nickkk 提问时间:3/16/2023 更新时间:3/19/2023 访问量:53

问:

不幸的是,直接在图层上设置阴影属性似乎不起作用:

let shadowView = NSView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
shadowView.wantsLayer = true
shadowView.layer!.backgroundColor = .white
shadowView.layer!.shadowRadius = 50
shadowView.layer!.shadowColor = .black
shadowView.layer!.shadowOffset = CGSize(width: 0, height: -30)
shadowView.layer!.shadowPath = CGPath(roundedRect: shadowView.bounds, cornerWidth: 25, cornerHeight: 25, transform: nil)

设置 NSView.shadow 属性会起作用:

let shadowView = NSView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))let shadow = NSShadow()
shadow.shadowBlurRadius = 50
shadow.shadowColor = .black
shadow.shadowOffset = CGSize(width: 0, height: -30)
shadowView.shadow = shadow
shadowView.wantsLayer = true
shadowView.layer!.backgroundColor = .white

但不支持自定义路径。使用自定义路径设置阴影的最简单方法是什么?NSShadow

可可 Calayer NSview查看

评论

0赞 DonMag 3/16/2023
本文: blog.prototypr.io/... ---向下滚动到 Shadow Performance ...这就是你要找的吗?
0赞 Nickkk 3/16/2023
谢谢,但是那篇文章也使用了该属性,这似乎有效,可能是因为该属性也同时被设置为图像,并且只能对图像使用阴影是相当有限的。CALayer.shadowPathcontents
0赞 DonMag 3/17/2023
我不认为这与图像有任何关系......看看我的答案。

答:

1赞 DonMag 3/17/2023 #1

编辑答案 - 评论后...

影子代码似乎不起作用的原因是缺少两个属性设置:

// need these two properties set
shadowView.layer!.masksToBounds = false
shadowView.layer!.shadowOpacity = 1.0

快速示例(我将原点移动到 100,100,以便我们可以看到完整的阴影):shadowView

class ViewController: NSViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let shadowView = NSView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        view.addSubview(shadowView)
        
        shadowView.wantsLayer = true
        
        shadowView.layer!.backgroundColor = .white
        shadowView.layer!.shadowRadius = 50
        shadowView.layer!.shadowColor = .black
        shadowView.layer!.shadowOffset = CGSize(width: 0, height: -30)
        shadowView.layer!.shadowPath = CGPath(roundedRect: shadowView.bounds, cornerWidth: 25, cornerHeight: 25, transform: nil)
        
        // need these two properties set
        shadowView.layer!.masksToBounds = false
        shadowView.layer!.shadowOpacity = 1.0  // set as desired
        
    }
    
}

结果:

enter image description here

评论

0赞 Nickkk 3/17/2023
非常感谢您的大量示例,但即使在这里,您也不是从自身而是从另一个(变量)创建阴影。问题仍然是为什么我的代码不起作用,以及如何在不进行图层内所有绘图的情况下使视图掉落阴影。NSViewCALayershapeLayer
0赞 DonMag 3/17/2023
@Nickkk - 哎呀......猜猜我误会了你在找什么。请参阅我答案底部的编辑
0赞 Nickkk 3/19/2023
啊,这是缺失的一点。(我已经尝试过了,但忘记将其包含在示例中。多谢!(您可能希望将这两部分颠倒,以便回答问题的那部分位于顶部,或者完全删除第一部分。masksToBoundsshadowOpacity
0赞 DonMag 3/21/2023
@Nickkk - 编辑了我的答案,以便直接解决您的问题。