Cocoa 添加到NSStatusItem按钮的NSView具有不透明边框
我一直在开发NSStatusItem用户代理,该代理将NSView子类添加为NSStatusItem.button的子视图,以提供动画图标 左键单击图标时,视图周围有一个明显的不透明边框 视图子类的init读取: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
- (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; }