调整NSVisualEffectView模糊半径和透明度

时间:2016-05-14 20:30:40

标签: swift macos cocoa

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)

enter image description here

我正试图看看左边的内容,但似乎我已经降级使用了右边的方法。

这是我的代码:

{{1}}

可能,相关 - 但没有回答我的问题:

2 个答案:

答案 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并按如下所示设置其属性:

NSVisualEffectView setting 我的View层次结构如下:

View hierarchy

所有减少模糊的方法都在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