Cocoa NSView模糊背景

4
我知道在Cocoa中可以创建透明窗口,但是是否可以模糊其后面的内容呢?我知道已经有类似问题的链接,但它们更多地处理实际NSView内部的模糊,而不是其后面的内容。这是否可能,如果可能的话,我需要研究哪种方法?

Possible Impossible?

Possible                      Impossible?
3个回答

2

我想设置半径和颜色,因此我的贡献是在自定义视图中进行操作以模糊背景。希望对你有所帮助。

view.wantsLayer = true
view.layerUsesCoreImageFilters = true
view.layer?.backgroundColor = NSColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 0.5).CGColor

let blurFilter = CIFilter(name: "CIGaussianBlur")
blurFilter?.setDefaults()
blurFilter?.setValue(2.5, forKey: kCIInputRadiusKey)
view.layer?.backgroundFilters?.append(blurFilter!)

太好了。可以在 macOS 上运行! - Vladimir Kuzomenskyi
1
对我不起作用。是否有任何先决条件,例如设置一些窗口设置? - eeqk

2
为了回答你的问题,是可以实现的。
如果你想要这种效果,请查看我创建的GitHub项目。我对NSWindow进行了子类化以禁用不透明度,然后使用位于Xcode实用工具侧边栏的视图效果检查器向NSView添加了背景过滤器:高斯模糊(您可以更改radius值以获得更多或更少的模糊效果)。
如果你想要新的Yosemite视图效果,请查看他们发布的新类NSVisualEffectView,只需对要使用此效果的NSView进行子类化即可。
希望你能发现我的回答有用。
最好的问候,

2
当我运行你的项目时,我只看到了一个视图,其中包含从不透明灰色到透明灰色的径向渐变?没有看到任何模糊。 - BonzaiThePenguin
你可能缺少某些库,我不知道你使用的是哪个版本的Xcode。无论如何,你可以查看项目并分析我所做的事情。 - rageofflames
这个Github项目非常奇怪。你可以通过简单的[self.window setOpaque:NO];禁用不透明度,并使用[self.window setBackgroundColor:[NSColor clearColor]];将背景颜色设置为透明。然后,添加高斯模糊作为背景滤镜时,不会像NSVisualEffectView那样使用后面的窗口图形来创建扩散/活力。 - Volomike
有什么奇怪的吗?从你写的内容中我真的无法理解它是什么... - rageofflames
奇怪的是,我不太明白为什么你必须要子类化 - 它可以在不使用子类化的情况下实现。此外,它会在内容上方放置一个白色模糊球,而不是执行 Apple Yosemite Vibrancy 效果,该效果将窗口后面的背景内容模糊到窗口中。看,我有这个问题,并学习了如何使窗口的某些部分透明(例如侧边栏),但我感到沮丧,因为我必须支持 10.8 及以上版本,无法像我想要的那样使用 Yosemite Vibrancy。 - Volomike
首先,我并不是在尝试实现Yosemite Vibrancy效果,因为它使用了多种效果而不仅仅是模糊,我不知道他们使用了多少效果或者哪些效果,也没有尝试实现相同的效果,我只是试图得到类似于问题中图片的东西。其次,由于我使用了高斯模糊,这是一种径向模糊,结果会在中心产生更强烈的模糊,向边缘变得更加平滑,因此中间的白色模糊球就出现了,你可以尝试其他方法看看是否达到了你想要的效果。子类化仅用于代码分割。 - rageofflames

1
截至2021年,为了实现模糊效果,您可以使用NSVisualEffectView代替NSView,而不是应用CIFilters并将APP大小增加至少60MB。选择要模糊的参考对象并设置其材料,以便选择适当的颜色或窗口背景进行模糊处理。
NSVisualEffectView *viewWithFX = [[NSVisualEffectView alloc] initWithFrame:NSMakeRect(0, 0, frameRect.size.width, 100)];
viewWithFX.autoresizingMask = NSViewWidthSizable | NSViewMinXMargin | NSViewMaxXMargin;
viewWithFX.translatesAutoresizingMaskIntoConstraints = YES;
viewWithFX.material = NSVisualEffectMaterialSidebar; // or NSVisualEffectMaterialMenu, or ..
viewWithFX.blendingMode = NSVisualEffectBlendingModeBehindWindow; //NSVisualEffectBlendingModeWithinWindow
[viewWithFX addSubview:<#subviews-will-not-have-fx-applied#>];

[self.view addSubview:viewWithFx];

这样做的优点是不需要图层,比CIFilters更快。 PS:这将增加您的应用程序大小约8..12MB。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接