当NSVisualEffectView
应用于NSWindow
(Swift或Objective-C)时,是否可以调整NSVisualEffectMaterial
的模糊半径和透明度?我尝试了CGSSetWindowBackgroundBlurRadius
的所有变体(黑暗,中等,浅色) - 但这并没有削减它。在下图中,我使用了Apple的非公开API,左侧为NSVisualEffectView
,右侧为blurView.blendingMode = NSVisualEffectBlendingMode.BehindWindow
blurView.material = NSVisualEffectMaterial.Medium
blurView.state = NSVisualEffectState.Active
self.window!.contentView!.addSubview(blurView)
。
我正试图看看左边的内容,但似乎我已经降级使用了右边的方法。
这是我的代码:
{{1}}
可能,相关 - 但没有回答我的问题:
答案 0 :(得分:2)
虽然我不建议这样做,除非您准备回到它未来的版本中工作,否则您可以使用以下内容将NSVisualEffectView
子类化为您想做的事情:
- (void)updateLayer
{
[super updateLayer];
[CATransaction begin];
[CATransaction setDisableActions:YES];
CALayer *backdropLayer = self.layer.sublayers.firstObject;
if ([backdropLayer.name hasPrefix:@"kCUIVariantMac"]) {
for (CALayer *activeLayer in backdropLayer.sublayers) {
if ([activeLayer.name isEqualToString:@"Active"]) {
for (CALayer *sublayer in activeLayer.sublayers) {
if ([sublayer.name isEqualToString:@"Backdrop"]) {
for (id filter in sublayer.filters) {
if ([filter respondsToSelector:@selector(name)] && [[filter name] isEqualToString:@"blur"]) {
if ([filter respondsToSelector:@selector(setValue:forKey:)]) {
[filter setValue:@5 forKey:@"inputRadius"];
}
}
}
}
}
}
}
}
[CATransaction commit];
}
虽然这本身不使用私有API,但它确实开始深入挖掘您不拥有的层次结构,因此请务必仔细检查您所获得的内容是否符合预期,如果不是,则优先失败。例如,在优胜美地10.10上,Backdrop
层是视觉效果视图的直接后果,因此将来可能会发生变化。
答案 1 :(得分:0)
我遇到了与您相同的问题,并且通过一些技巧解决了该问题,似乎可以完成我想要的工作。希望对您有所帮助。
因此,在我的情况下,我在情节提要中添加了NSVisualEffectView
并按如下所示设置其属性:
所有减少模糊的方法都在NSViewController中:
override func viewWillAppear() {
super.viewWillAppear()
//Adds transparency to the app
view.window?.isOpaque = false
view.window?.alphaValue = 0.98 //tweak the alphaValue for your desired effect
}
在您的示例中,除了上面的调整外,此代码还应该起作用:
let blurView = NSVisualEffectView(frame: view.bounds)
blurView.blendingMode = .behindWindow
blurView.material = .fullScreenUI
blurView.state = .active
view.window?.contentView?.addSubview(blurView)
Swift 5代码 对于任何对此感兴趣的人,都是指向我的仓库的链接,我在其中创建了一个使用上面的代码的小型恶作剧应用: GitHub link