Cocoa 添加到NSStatusItem按钮的NSView具有不透明边框

Cocoa 添加到NSStatusItem按钮的NSView具有不透明边框,cocoa,nsview,nsstatusitem,Cocoa,Nsview,Nsstatusitem,我一直在开发NSStatusItem用户代理,该代理将NSView子类添加为NSStatusItem.button的子视图,以提供动画图标 左键单击图标时,视图周围有一个明显的不透明边框 视图子类的init读取: - (instancetype)initWithFrame:(NSRect )rect { self = [super initWithFrame:rect]; if ( self ) { self.wantsLayer = YES; s

我一直在开发NSStatusItem用户代理,该代理将NSView子类添加为NSStatusItem.button的子视图,以提供动画图标

左键单击图标时,视图周围有一个明显的不透明边框

视图子类的init读取:

- (instancetype)initWithFrame:(NSRect )rect
{
    self = [super initWithFrame:rect];
    if ( self ) {
        self.wantsLayer = YES;
        self.layer.opaque = NO;
        [self.layer addSublayer:self.background];
        [self.layer addSublayer:self.foreground];
        [self.layer addSublayer:self.symbol];
    }
    return self;
}
控制器将视图StatusView添加到NSStatusBarItem的按钮:

    self.statusItem.highlightMode = YES;
    [self.statusItem.button addSubview:self.statusView];
下面是鼠标左键按下后的样子:


这并不是我所希望的那种完美的外观。

我花了很多时间阅读文档,试图找出如何去除边界。我检查了视图、图层和子图层中的不透明度。我将背景色设置为清晰。我和阿尔法搞砸了。我重新编写了没有图层的视图。没有什么能摆脱这种不透明的束缚,我准备放弃,通过一个带有setTemplate的NSImage提供我的内容:是的

作为理解发生了什么的最后努力,我编写了一个简短的方法来遍历视图的层次结构,查找不透明的视图:

- (void)displayViewInfo:(NSView *)view
{
    NSLog(@"view %@\tisOpaque %d, vibrancy %d super %@",
          view,view.isOpaque,view.allowsVibrancy, view.superview);
    for (NSView *v in view.subviews){
         [self displayViewInfo:v];
    }
}
在仔细阅读NSView的文档时,我发现了属性opaqueconsensor,并认为这可能是一个开始寻找的好地方

从我的NSView子类的drawLayer:inContext:method调用

[self displayViewInfo:self.opaqueAncestor];
输出(时间戳信息已修剪)如下所示:

view <NSNextStepFrame: 0x610000181380>   isOpaque 1, vibrancy 0 super (null)
view <NSVisualEffectView: 0x1006023e0>   isOpaque 0, vibrancy 1 super <NSNextStepFrame: 0x610000181380>
view <NSStatusBarButton: 0x600000161bc0> isOpaque 0, vibrancy 1 super <NSVisualEffectView: 0x1006023e0>
view <StatusView: 0x6000001a02a0>        isOpaque 0, vibrancy 0 super <NSStatusBarButton: 0x600000161bc0>
结果不言而喻:

希望这个悲伤和救赎的故事能为人们节省一些时间;这确实让我感到困惑

- (BOOL)allowVibrancy { return YES; }