gpt4 book ai didi

swift - 调整 NSVisualEffectView 模糊半径和透明度

转载 作者:行者123 更新时间:2023-12-03 16:09:48 25 4
gpt4 key购买 nike

当将 NSVisualEffectView 应用于 NSWindow(Swift 或 Objective-C)时,是否可以调整它的模糊半径和透明度?我尝试了 NSVisualEffectMaterial 的所有变体(深色、中度、浅色) - 但这并不能解决问题。在下图中,我使用了 Apple 的非公共(public) API,左侧为 CGSSetWindowBackgroundBlurRadius,右侧为 NSVisualEffectView

enter image description here

我正在尝试实现左侧的外观,但似乎我不得不使用右侧的方法。

这是我的代码:

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];
}

虽然这本身并不使用私有(private) API,但它确实开始深入挖掘您不拥有的层层次结构,因此请务必仔细检查您返回的内容是否符合您的预期,如果不是,请优雅地失败。例如,在 10.10 Yosemite 上,Backdrop 层是 Visual Effect View 的直接后代,因此 future 情况可能会发生变化。

关于swift - 调整 NSVisualEffectView 模糊半径和透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33850478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com