BGHUDAppKit BGHUDTabView _draw Theme Частное переопределение API теперь перестал работать
В течение многих лет я использовал код, изначально основанный на BGHUDAppKit, и нашел замены для всех частных API, которые переопределяет BGHUDAppKit.
За исключением одного, который я мог бы не найти способ заменить ...
-[NSTabView _drawThemeTab:withState:inRect:]
(Примечание: я также использую почтенный PSMTabBarControl во многих обстоятельствах, поэтому, если ничего не получится, япреобразовать все мои представления вкладок в PSMTabBarControl)
Apple теперь добавила темный NSAppearance в 10,14 Мохаве (так что через ~ 10 лет я смогу использовать его, как только мы перестанем поддерживать Высшую Сьерру).
Какой бы эгоистичныйdev в Apple пишет, что NSTabView не верит в то, чтобы сделать его представление настраиваемым, в отличие от всех других настраиваемых элементов NSControl.Вот часть хакерских переопределений для пользовательского чертежа NSTabView:
// until we can eliminate private API _drawThemeTab:, return nil for new NSAppearance
- (id) appearance { return nil; }
- (id) effectiveAppearance { return nil; }
-(void)_drawThemeTab:(id) tabItem withState:(NSUInteger) state inRect:(NSRect) aRect {
NSInteger idx = [self indexOfTabViewItem: tabItem];
int gradientAngle = 90;
NSBezierPath *path = nil;
aRect = NSInsetRect(aRect, 0.5f, 0.5f);
if([self tabViewType] == NSLeftTabsBezelBorder) {
gradientAngle = 0;
} else if([self tabViewType] == NSRightTabsBezelBorder) {
gradientAngle = 180;
}
NSColor *specialFillColor = [tabItem color];
NSColor *outlineColor = nil;
NSString *name = [specialFillColor description];
// MEC - added new prefix 12/15/17 to fix white border around last segment in High Sierra
if ( [name hasPrefix:@"NSNamedColorSpace System"] || [name hasPrefix:@"Catalog color: System controlColor"])
specialFillColor = nil;
else if ( [name isEqualToString: @"NSCalibratedWhiteColorSpace 0 1"] )
[specialFillColor set];
else
{
outlineColor = specialFillColor;
specialFillColor = nil;
}
... etc ...