2015-05-02 84 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

希望這個故事悲哀和贖回將節省的人一段時間;它確實讓我感到困惑。