2014-11-12 3 views
2

Я использую вид на основе NSOutlineView, который имеет selectionHighlightStyle, установленный в NSTableViewSelectionHighlightStyleSourceList.Пользовательский стиль выбора для представления «Список источников» NSOutlineView

Я хочу переписать стиль выделения (фон) для определенных строк и нарисовать другой цвет/градиент.

То, что я пробовал до сих пор, это создание пользовательского NSTableRowView и возврат его через outlineView:rowViewForItem:. Я проверил, что мои пользовательские представления строк создаются и возвращаются делегатом представления схемы. Однако ни один из методов, которые я переписываю в пользовательском представлении строк, вызывается.

Я попытался перезаписать drawBackgroundInRect:, drawSelectionInRect:, drawSeparatorInRect: и даже drawRect:. Ни один из них не называется, никогда.

Я подозреваю, что набросок схемы выполняет какую-то обычную «магию», когда она настроена на стиль списка источников, но я ничего не нашел в документации, которая указывает, что пользовательский NSTableRowView не будет удостоен чести все в этом случае.

ответ

1

Вы используете Йосемити? Из документа от Apple Adopting Advanced Features of the new UI in Yosemite

Когда selectionHighlightStyle == NSTableViewSelectionHighlightStyleSourceList • Выбор теперь специальный синий материал, который делает за окно смешивания - Материал размер и рисунок не может быть изменен

Если вы установите его в NSTableViewSelectionHighlightStyleRegular и переопределите drawRect, он должен работать.

+0

Да, я использую Yosemite, и хотя я смотрел сессию WWDC, на которую вы ссылаетесь, я, кажется, пропустил «Размер материала и рисунок нельзя настроить». Похоже, мне не повезло, если я хочу обоим, используйте стиль списка источников и настройте чертеж выделения для нескольких строк. – lemonmojo

+0

Вы пытаетесь удалить синюю подсветку? Если это так, вам может быть интересно: http://stackoverflow.com/questions/26596621/how-to-get-the-source-lists-selection-highlight-to-use-the-dark-vibrancy-appeara/ 26990727 # 26990727 – Oskar

+0

Это определенно полезно, и я только что реализовал это в другой части моего приложения. Удивительное открытие!Тем не менее, в этом конкретном случае я бы хотел перезаписать синий цвет по умолчанию, чтобы быть совершенно другим цветом/градиентом. – lemonmojo

0

Вам нужно перезаписать -selectionHighlightStyle в вашем NSTableRowView подкласса:

- (NSTableViewSelectionHighlightStyle)selectionHighlightStyle 
{ 
    return NSTableViewSelectionHighlightStyleRegular; 
} 

Таким образом, представление таблицы можно использовать в исходном списке стиле, но с настраиваемой выбора строки. Я хотел иметь исходный список в Yosemite в моем проекте, но с выбранным пользователем цветом из системных настроек.

Редактировать: Я просто заметил, что это делает причиной появления текстовых полей и изображений в представлении ячейки, чтобы артефакт, похожий на границу, выглядел очень странным и уродливым.

+0

Я просто заметил, что это делает причиной появления текстовых полей и изображений в ячейке зрения, чтобы артефакт, похожий на границу, выглядел очень странным и уродливым. Нижняя строка - цвет выбора стиля исходного списка не может быть скорректирован. Вместо этого я использовал обычный стиль и вручную разработал представление схемы, чтобы выглядеть как исходный список. Примечание. Если вы нацеливаете Yosemite и хотите, чтобы полупрозрачный фон выглядел, который включен по умолчанию при использовании исходного списка, вам необходимо встроить представление схемы в NSVisualEffectView. – Toby

+0

Я знаю о возможности использования NSTableViewSelectionHighlightStyleRegular и «фальсификации» внешнего вида исходного кода, но я бы предпочел иметь нестандартные стили выделения вместо того, чтобы реализовать весь исходный стиль списка ... – lemonmojo

+0

Согласен, родной в основном лучше Я думаю, что это не так. Поиск способа изменения/взлома контура для того, чтобы настраиваемые строки выбора в режиме списка источников занимали значительно больше времени, чем изменение вида вручную. – Toby

3

AppKit добавляет отдельные NSVisualEffectView с пользовательским материалом для просмотра строки для рисования фона при использовании NSTableViewSelectionHighlightStyleSourceList. Я придумал следующее обходное решение, которое использует нулевые частные API, но может сломаться позже, если Apple реализует другой способ выделения строк.

@class CustomHighlightRowSelectionView; 
@interface CustomHighlightRowView : NSTableRowView 

@property (nonatomic, strong) CustomHighlightRowSelectionView *selectionView; 

@end 

@interface CustomHighlightRowSelectionView : NSView 

@property (nonatomic, getter=isEmphasized) BOOL emphasized; 
@property (nonatomic, getter=isSelected) BOOL selected; 

@end 


@implementation CustomHighlightRowView 

- (CustomHighlightRowSelectionView *)selectionView 
{ 
    if (!_selectionView) 
    { 
     _selectionView = [[CustomHighlightRowSelectionView alloc] initWithFrame:NSZeroRect]; 
    } 

    return _selectionView; 
} 

- (void)setEmphasized:(BOOL)emphasized 
{ 
    [super setEmphasized:emphasized]; 
    self.selectionView.emphasized = emphasized; 
} 

- (void)setSelected:(BOOL)selected 
{ 
    [super setSelected:selected]; 
    self.selectionView.selected = selected; 
} 

- (void)addSubview:(NSView *)aView positioned:(NSWindowOrderingMode)place relativeTo:(NSView *)otherView 
{ 
    if (![aView isKindOfClass:[NSVisualEffectView class]]) 
    { 
     [super addSubview:aView positioned:place relativeTo:otherView]; 
    } 
    else 
    { 
     if (!self.selectionView.superview) 
     { 
      [super addSubview:self.selectionView positioned:place relativeTo:otherView]; 
      self.selectionView.frame = self.bounds; 
     } 
    } 
} 

- (void)setFrame:(NSRect)frame 
{ 
    [super setFrame:frame]; 

    self.selectionView.frame = self.bounds; 
} 

- (void)setBounds:(NSRect)bounds 
{ 
    [super setBounds:bounds]; 

    self.selectionView.frame = self.bounds; 
} 

@end 

@implementation CustomHighlightRowSelectionView 

- (void)setEmphasized:(BOOL)emphasized 
{ 
    _emphasized = emphasized; 
    [self setNeedsDisplay:YES]; 
} 

- (void)setSelected:(BOOL)selected 
{ 
    _selected = selected; 
    [self setNeedsDisplay:YES]; 
} 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    if (!self.selected) 
    { 
     return; 
    } 

    NSColor *fillColor = self.emphasized ? [NSColor alternateSelectedControlColor] : [NSColor secondarySelectedControlColor]; 
    [fillColor setFill]; 
    NSRectFill(dirtyRect); 
} 

@end 
+0

Удивительная находка - отлично работает! – lemonmojo