BGHUDAppKit BGHUDTabView _drawThemeTab 私有 API 覆盖现已损坏
多年来,我一直在使用最初基于 BGHUDAppKit 的代码,并找到了 BGHUDAppKit 覆盖的所有私有 API 的替代品。
除了我找不到替换的方法...
-[NSTabView _drawThemeTab:withState:inRect:]
(注意:我在很多情况下也使用古老的 PSMTabBarControl,所以如果一切都失败了,我会将所有选项卡视图转换为 PSMTabBarControl)
Apple 现在在 10.14 Mojave 中添加了深色 NSAppearance(所以在大约 10 年内,一旦我们停止支持 High Sierra,我就可以使用它)。
无论哪位 Apple 的自私开发人员写道,NSTabView 都不相信让他的视图可定制,这与所有其他可定制的 NSControl 不同。这是 NSTabView 的自定义绘图的 hackish 覆盖的一部分:
// 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 ...