如何将模糊效果应用于nsview/nswindow?

Dav*_*eza 2 opacity nsview nswindow osx-yosemite

我正在为新的OS X Yosemite创建一个应用程序.我想创建一个在这个新版本中非常常见的效果,不透明度.例如,我想要的效果就像"Mail"应用程序中存在的效果一样.左视图(我们有"收件箱","已标记","已发送"等)具有背景模糊效果.

如何将此效果应用于我的应用程序?此效果适用于NSView或NSWindow?

谢谢!

Rob*_*ers 10

我自己正在寻找这个确切的东西,并设法找到一个答案,我将在这里发布,虽然这是一个相当古老的问题.

此方法模糊了视图及其所有子视图:

- (void)blurView:(NSView *)view
{
    NSView *blurView = [[NSView alloc] initWithFrame:view.bounds];
    blurView.wantsLayer = YES;
    blurView.layer.backgroundColor = [NSColor clearColor].CGColor;
    blurView.layer.masksToBounds = YES;
    blurView.layerUsesCoreImageFilters = YES;
    blurView.layer.needsDisplayOnBoundsChange = YES;

    CIFilter *saturationFilter = [CIFilter filterWithName:@"CIColorControls"];
    [saturationFilter setDefaults];
    [saturationFilter setValue:@2.0 forKey:@"inputSaturation"];

    CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"]; // Other blur types are available
    [blurFilter setDefaults];
    [blurFilter setValue:@2.0 forKey:@"inputRadius"];

    blurView.layer.backgroundFilters = @[saturationFilter, blurFilter];

    [view addSubview:blurView];

    [blurView.layer setNeedsDisplay];
}
Run Code Online (Sandbox Code Playgroud)

或者在Swift中:

private func blur(view: NSView!) {
        var blurView = NSView(frame: view.bounds)
        blurView.wantsLayer = true
        blurView.layer?.backgroundColor = NSColor.clearColor().CGColor
        blurView.layer?.masksToBounds = true
        blurView.layerUsesCoreImageFilters = true
        blurView.layer?.needsDisplayOnBoundsChange = true

        var satFilter = CIFilter(name: "CIColorControls")
        satFilter.setDefaults()
        satFilter.setValue(NSNumber(float: 2.0), forKey: "inputSaturation")

        var blurFilter = CIFilter(name: "CIGaussianBlur")
        blurFilter.setDefaults()
        blurFilter.setValue(NSNumber(float: 2.0), forKey: "inputRadius")

        blurView.layer?.backgroundFilters = [satFilter, blurFilter]

        view.addSubview(blurView)

        blurView.layer?.needsDisplay()
    }
Run Code Online (Sandbox Code Playgroud)

此代码是根据此处的优秀教程进行调整和改编的.