首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调整NSVisualEffectView模糊半径和透明度

调整NSVisualEffectView模糊半径和透明度
EN

Stack Overflow用户
提问于 2016-05-14 20:30:40
回答 2查看 3.4K关注 0票数 7

NSVisualEffectView应用于NSWindow (Swift或Objective)时,是否有可能调整它的模糊半径和透明度?我尝试了NSVisualEffectMaterial的所有变体(暗、中、轻)--但这并没有削减它。在下面的图片中,我使用了苹果的非公共API,左边是CGSSetWindowBackgroundBlurRadius,右边是NSVisualEffectView

我试图达到左边的样子,但我似乎被降级使用右边的方法。

这是我的密码:

代码语言:javascript
复制
blurView.blendingMode = NSVisualEffectBlendingMode.BehindWindow
blurView.material = NSVisualEffectMaterial.Medium
blurView.state = NSVisualEffectState.Active
self.window!.contentView!.addSubview(blurView)

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

EN

回答 2

Stack Overflow用户

发布于 2016-05-15 03:24:11

虽然我不建议这样做,除非您已经准备好在将来的发行版中重新使用它,但是您可以使用下面的子类NSVisualEffectView来执行您想做的事情:

代码语言:javascript
复制
- (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 Yosemite上,Backdrop层是视觉效果视图的直接死者,因此未来的情况可能会发生变化。

票数 3
EN

Stack Overflow用户

发布于 2020-07-20 22:48:13

我和你有同样的问题,我用一个小把戏解决了这个问题,似乎完成了我想要的工作。我希望它也能对你有所帮助。

因此,在我的例子中,我在故事板中添加了NSVisualEffectView,并将其属性设置为:

我的视图层次如下:

所有减少模糊度的方法都是在NSViewController中:

代码语言:javascript
复制
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
}

在下面的示例中,除了上面的调整之外,这段代码还可以工作:

代码语言:javascript
复制
    let blurView = NSVisualEffectView(frame: view.bounds)
    blurView.blendingMode = .behindWindow
    blurView.material = .fullScreenUI
    blurView.state = .active
    view.window?.contentView?.addSubview(blurView)

对于任何感兴趣的人来说,Swift 5代码都是指向我的回购的链接,我在那里创建了一个小恶作剧应用程序,它使用了上面的代码:GitHub链路

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37231536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档