2015-05-02 4 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; 
} 

мнения, На начальном, добавляются контроллером к кнопке NSStatusBarItem в:

self.statusItem.highlightMode = YES; 
    [self.statusItem.button addSubview:self.statusView]; 

Вот что это выглядело как после левой кнопкой мыши вниз :

Opaque border around view in highlight mode

Не на что я надеялся.

ответ

1

Я потратил много времени на чтение документации, пытаясь выяснить, как избавиться от этой границы. Я посмотрел на непрозрачность на мой взгляд, на слой и подслои. Я устанавливаю цвета фона для очистки. Я перепутал с альфой. Я переписал свое представление без слоев. Ничто не могло избавиться от этой непрозрачной привязки, и я был готов бросить полотенце и предоставить свой контент через NSImage с помощью setTemplate: YES.

В последнем усилии канавы, чтобы понять, что происходит, я написал короткий способ пройти по иерархии вида по поискам точки зрения, что было непрозрачным:

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

opaqueAncestor из На начальном оказался вид корня иерархии и все подвиды докладывали не непрозрачные. Я добавил проверку allowVibrancy после нескольких мутаций метода. Мне было интересно, что супервизоры StatusView позволяли играть, и мой взгляд не был таким. Документация на имущество allowVibrancy смутно многообещающим, так что я добавил это к моему мнению:

- (BOOL)allowVibrancy { return YES; } 

Результат говорит сам за себя:

Highlight mode properly surrounding view

Надеюсь, это рассказ о горе и искупления спасет кого-то когда-то; он был уверен, что я озадачен.