【发布时间】:2023-04-05 22:20:01
【问题描述】:
我知道在 Cocoa 中可以创建透明窗口,但是否可以模糊其背后的任何内容?我知道有similar questions,但它们处理的内容更多地模糊了实际 NSView 中的内容,而不是背后的内容。这甚至可能吗?如果可以,我需要研究什么方法?
Possible Impossible?
【问题讨论】:
标签: objective-c macos cocoa nsview
我知道在 Cocoa 中可以创建透明窗口,但是否可以模糊其背后的任何内容?我知道有similar questions,但它们处理的内容更多地模糊了实际 NSView 中的内容,而不是背后的内容。这甚至可能吗?如果可以,我需要研究什么方法?
Possible Impossible?
【问题讨论】:
标签: objective-c macos cocoa nsview
为了回答你,是的,它是可能的。
如果您想要这种效果,请查看我创建的 GitHub Project。我将 NSWindow 子类化以禁用不透明度,然后我使用位于 Xcode Utilities 侧栏的 View Effects Inspector 添加了背景过滤器:高斯模糊到 NSView(您可以或多或少地更改 radius 值模糊效果)。
如果您想要新的 Yosemite View 效果,请查看他们发布的新类 NSVisualEffectView,只需将您想要使用此效果的 NSView 子类化即可。
希望我的回答对你有用。
最好的问候,
【讨论】:
[self.window setOpaque:NO]; 禁用不透明度,并且可以使用[self.window setBackgroundColor:[NSColor clearColor]]; 将背景颜色设置为清除。然后,添加高斯模糊作为背景过滤器不会像 NSVisualEffectView 那样使用后面的窗口图形来创建扩散/活力。
我的贡献是我想设置半径和颜色。
在自定义视图中执行此操作以模糊背后的内容。高温
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!)
【讨论】:
从 2021 年开始,您无需应用 CIFilters 并将您的 APP 大小至少增加 60MB 以获得模糊效果,您只需使用 NSVisualEffectView 来换取您的 NSView。选择要模糊的参考并设置您认为它具有的材质,因此选择适当的颜色或窗口背景作为模糊的基础。
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。
【讨论】: