【问题标题】:Cocoa NSView blurred background可可 NSView 模糊背景
【发布时间】:2023-04-05 22:20:01
【问题描述】:

我知道在 Cocoa 中可以创建透明窗口,但是否可以模糊其背后的任何内容?我知道有similar questions,但它们处理的内容更多地模糊了实际 NSView 中的内容,而不是背后的内容。这甚至可能吗?如果可以,我需要研究什么方法?

Possible                      Impossible?

【问题讨论】:

    标签: objective-c macos cocoa nsview


    【解决方案1】:

    为了回答你,是的,它是可能的。

    如果您想要这种效果,请查看我创建的 GitHub Project。我将 NSWindow 子类化以禁用不透明度,然后我使用位于 Xcode Utilities 侧栏的 View Effects Inspector 添加了背景过滤器:高斯模糊到 NSView(您可以或多或少地更改 radius 值模糊效果)。

    如果您想要新的 Yosemite View 效果,请查看他们发布的新类 NSVisualEffectView,只需将您想要使用此效果的 NSView 子类化即可。

    希望我的回答对你有用。

    最好的问候,

    【讨论】:

    • 当我运行你的项目时,我刚刚得到一个包含从不透明灰色到透明灰色的径向渐变的视图?在任何地方都看不到任何模糊。
    • 您可能缺少一些库,我不知道您正在运行哪个 Xcode。无论哪种方式,您都可以查看项目并分析我所做的事情
    • 这个Github项目很奇怪。您可以使用简单的[self.window setOpaque:NO]; 禁用不透明度,并且可以使用[self.window setBackgroundColor:[NSColor clearColor]]; 将背景颜色设置为清除。然后,添加高斯模糊作为背景过滤器不会像 NSVisualEffectView 那样使用后面的窗口图形来创建扩散/活力。
    • 这有什么奇怪的?从您写的内容中无法真正理解它是什么......
    • 奇怪的是我不太明白你为什么要子类化——它可以在没有子类化的情况下实现。此外,它在内容顶部放置了一个白色模糊球,而不是执行 Apple Yosemite Vibrancy 效果,将窗口后面的背景内容模糊到窗口中。看,我有 this question 并学会了如何使我的窗口的某些部分透明(如侧边栏),但我很沮丧,因为我必须支持 10.8 及更高版本,并且不能像我想要的那样使用 Yosemite Vibrancy。
    【解决方案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!)
    

    【讨论】:

      【解决方案3】:

      从 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-24
        • 1970-01-01
        • 2021-01-15
        • 2017-07-17
        • 1970-01-01
        • 2013-10-19
        • 1970-01-01
        相关资源
        最近更新 更多