0

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 ...
4

1 回答 1

2

最好完全禁用 NSTabView 的绘图(将其设置tabViewTypeNSNoTabsNoBorder),并创建一个自定义分段条形视图以单独绘制选择(作为同级视图)。这允许您完全控制该自定义实现的外观、布局和大小,而不是依赖 NSTabView 的任何细节。

查看 NSTabViewController 的视图层次结构,您可以看到通过使用 NSSegmentedControl 作为单独的子视图管理 NSTabView 的选择,它具有相同的方法。

于 2018-06-12T08:12:49.380 回答