Кто-нибудь нашелюридическиепереопределения для настройки рисунка NSTabView?

Keith Knauber спросил: 12 мая 2018 в 05:17 в: drawrect

BGHUDAppKit BGHUDTabView _drawThemeTab закрытый API-интерфейс теперь сломан.

В течение многих лет я использовал код, первоначально основанный на BGHUDAppKit, и нашел замены для всего частного API, который BGHUDAppKit переопределяет.

p> За исключением того, что я мог not найти способ замены ...
-[NSTabView _drawThemeTab:withState:inRect:]

(Примечание: во многих случаях я также использую почтенный PSMTabBarControl, поэтому, если все остальное не сработает, я конвертирую все мои представления вкладок в PSMTabBarControl).

Apple добавила темный NSAppearance в 10.14 Mojave (так что через ~ 10 лет я могу использовать его, как только мы перестанем поддерживать High Sierra) .

Каким бы ни был эгоистичный разработчик Apple, NSTabView не верит в то, что он может настраивать свой взгляд, в отличие от all других NSControls, которые настраиваются. Вот часть хакерских переопределений для пользовательских рисунок 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 ...

1 ответ

Taylor ответил: 19 мая 2018 в 06:32

Вероятно, желательно полностью отключить чертеж NSTabView (настройка его tabViewType на NSNoTabsNoBorder) и создать собственное сегментированное представление в виде штрихов, чтобы нарисовать выделение отдельно (в виде представления для сестер). Это позволяет полностью контролировать внешний вид, макет и размер этой пользовательской реализации, а не полагаться на какие-либо детали NSTabView.

Посмотрев на иерархию представлений NSTabViewController, вы можете видеть, что она имеет тот же самый подход с использованием NSSegmentedControl в качестве отдельного элемента управления подвью в NSTabView.