Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 调整NSVisualEffectView模糊半径和透明度_Swift_Macos_Cocoa - Fatal编程技术网

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

Swift 调整NSVisualEffectView模糊半径和透明度,swift,macos,cocoa,Swift,Macos,Cocoa,当应用于NSWindow(Swift或Objective-C)时,是否可以调整NSVisualEffectView的模糊半径和透明度?我尝试了NSVisualEffectMaterial(暗、中、亮)的所有变体,但都没有成功。在下图中,我使用了苹果的非公开API,左边是cgsetwindowbackgroundblurradius,右边是NSVisualEffectView 我试图达到左边的外观,但似乎我降级到使用右边的方法 这是我的密码: blurView.blendingMode = NS

当应用于
NSWindow
(Swift或Objective-C)时,是否可以调整
NSVisualEffectView
的模糊半径和透明度?我尝试了
NSVisualEffectMaterial
(暗、中、亮)的所有变体,但都没有成功。在下图中,我使用了苹果的非公开API,左边是
cgsetwindowbackgroundblurradius
,右边是
NSVisualEffectView

我试图达到左边的外观,但似乎我降级到使用右边的方法

这是我的密码:

blurView.blendingMode = NSVisualEffectBlendingMode.BehindWindow
blurView.material = NSVisualEffectMaterial.Medium
blurView.state = NSVisualEffectState.Active
self.window!.contentView!.addSubview(blurView)
可能是相关的-但没有回答我的问题:

  • -没有回答

尽管我不建议这样做,除非您准备退回到在将来的版本中不起作用的状态,但您可以使用下面的子类
NSVisualEffectView
来执行您想要的操作:

- (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约塞米蒂,背景层是视觉效果视图的直接继承者,因此未来情况可能会发生变化。

我遇到了与您相同的问题,我用一个小技巧解决了它,似乎完成了我想要的工作。我希望它也能帮助你

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

我的视图层次结构如下所示:

减少模糊的所有功能都在NSViewController中:

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
}
根据您的示例,此代码还应与上面的调整配合使用:

    let blurView = NSVisualEffectView(frame: view.bounds)
    blurView.blendingMode = .behindWindow
    blurView.material = .fullScreenUI
    blurView.state = .active
    view.window?.contentView?.addSubview(blurView)
Swift 5代码 对于任何感兴趣的人,这里有一个指向我的回购协议的链接,我在这里创建了一个使用上述代码的小型恶作剧应用程序:

您好,谢谢您的回答,但不幸的是,这似乎根本无法调整透明度。此示例用于窗口内模糊,因此您可能需要浏览图层层次结构以获得所需的特定图层。在
updateLayer
中设置断点,并连续调用
po self.layer.sublayers
以查看需要在视觉效果视图中搜索的内容。方便的是,大多数层都是命名的,所以您可以像这样一点一点地向下钻取。我相信还有另一个层叫做
Tint
,它也控制着色调。