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
,它也控制着色调。