提问人:Nickkk 提问时间:3/16/2023 更新时间:3/19/2023 访问量:53
在 NSView 上使用自定义影子路径
Using custom shadow path on NSView
问:
不幸的是,直接在图层上设置阴影属性似乎不起作用:
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
答:
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
}
}
结果:
评论
0赞
Nickkk
3/17/2023
非常感谢您的大量示例,但即使在这里,您也不是从自身而是从另一个(变量)创建阴影。问题仍然是为什么我的代码不起作用,以及如何在不进行图层内所有绘图的情况下使视图掉落阴影。NSView
CALayer
shapeLayer
0赞
DonMag
3/17/2023
@Nickkk - 哎呀......猜猜我误会了你在找什么。请参阅我答案底部的编辑。
0赞
Nickkk
3/19/2023
啊,这是缺失的一点。(我已经尝试过了,但忘记将其包含在示例中。多谢!(您可能希望将这两部分颠倒,以便回答问题的那部分位于顶部,或者完全删除第一部分。masksToBounds
shadowOpacity
0赞
DonMag
3/21/2023
@Nickkk - 编辑了我的答案,以便直接解决您的问题。
评论
CALayer.shadowPath
contents