2015-05-02 46 views
1

我一直在努力的NSStatusItem用户代理添加NSView子类作为NSStatusItem.button子视图提供动画图标。NSView添加到NSStatusItem按钮有一个不透明的边框

当左击图标时,视图周围会有明显的不透明边框。

视图子类的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]; 

下面是它看起来像一个鼠标左键后下降:

Opaque border around view in highlight mode

不是真的是我期待的抛光外观。

回答

1

我花了很多时间阅读文档,试图找出如何摆脱边界。我检查了我的视图中的不透明度,图层和子图层。我设置背景颜色清除。我搞砸了阿尔法。我重写了没有图层的视图。没有任何东西可以摆脱那种不透明的束缚,我准备投入毛巾并通过带有setTemplate:YES的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]; 
    } 
} 

我发现财产opaqueAncestor而研读NSView的文档,并认为这可能是一个很好的开始寻找的地方。

因此从我的NSView子类的drawLayer:inContext:方法中调用。

[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> 

StatusView的opaqueAncestor竟然是该层次的根视图,所有的子视图均报告没有不透明。我在方法的几个突变后添加了allowVibrancy检查。我发现有趣的是,StatusView的超级视图允许活力,我的观点不是。对房地产allowVibrancy文档隐约有前途的,所以我说这个我的看法:

- (BOOL)allowVibrancy { return YES; } 

结果不言自明:

Highlight mode properly surrounding view

希望这个故事悲哀和赎回将节省的人一段时间;它确实让我感到困惑。