Кто-нибудь нашел ** легальные ** переопределения для настройки чертежа NSTabView? - PullRequest
0 голосов
/ 05 июня 2018

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

1 Ответ

0 голосов
/ 12 июня 2018

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

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

...