2016-04-25 7 views
0

я написал вид на основе TableView, как это: enter image description hereВыбор на основе NSTableView?

и рисую выделение NSTableRowView, код выглядит так:

- (void)drawRect:(NSRect)dirtyRect { 
    [[NSColor clearColor] setFill]; 
    if (self.isClicked) { 
    [[[NSColor blackColor] colorWithAlphaComponent:0.08] setFill]; 
    } 
    NSRect rowViewRect = NSMakeRect(0, 0, 274, 72); 
    NSBezierPath *path = [NSBezierPath bezierPathWithRect:rowViewRect]; 
    [path fill]; 
} 

Но, наконец, я нашел TableRowView не над Tableview , поэтому selectedColor не покрывает изображение и кнопку, это больше как цвет фона, но мне нужно выбранное TableRowView покрытие вид, так же, как это:

enter image description here

Выбранный цвет охватывает изображение и кнопку. У меня есть googled, но не нашел никаких идей. Спасибо за помощь ~

ответ

1

Так что это немного сложно. Стратегия состоит в том, чтобы иметь оверлейный цветной вид с альфами меньше 1 в вашем NSTableCellView, а затем добавлять и удалять его на основе выбора ячейки.

Первый, вам нужно NSView, который может установить цвет фона:

NSView_Background.h

@interface NSView_Background : NSView 
@property (nonatomic, strong) NSColor *background; 
@end 

NSView_Background.m

#import "NSView_Background.h" 

@implementation NSView_Background 

- (void)drawRect:(NSRect)dirtyRect { 
    [self.background set]; 
    NSRectFill([self bounds]); 
} 

- (void)setBackground:(NSColor *)color { 
    if ([_background isEqual:color]) return; 

    _background = color; 

    [self setNeedsDisplay:YES]; 
} 
@end 

Второй, в вашем NSTableCellView подклассе добавить свойство NSView_Background:

#import "NSView_Background.h" 

@interface 
@property (nonatomic, strong) NSView_Background *selectionView; 
@end 

Третий, добавьте этот метод NSTableCellView подкласса:

- (void)shouldShowSelectionView:(BOOL)shouldShowSelectionView { 
    if (shouldShowSelectionView) { 
     self.selectionView = [[NSView_Background alloc] init]; 
     [self.selectionView setBackground:[NSColor grayColor]]; 
     self.selectionView.alpha = 0.4; 
     [self addSubview:self.selectionView]; 

     [self setNeedsDisplay:YES]; // draws the selection view 
    } else { 
     [self.selectionView removeFromSuperview]; 
     self.selectionView = nil; 
    } 
} 

Четвертый, добавьте в DrawRect в вашем NSTableCellView подкласса:

- (void)drawRect:(NSRect)dirtyRect { 
    if (self.selectionView) 
     self.selectionView.frame = self.bounds; 
} 

Финал LY, переопределить NSTableCellView: setBackgroundStyle:

- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle { 
    switch (backgroundStyle) { 
     case: NSBackgroundStyleDark: 
      [self shouldShowSelectionView:YES]; 
      break; 
     default: 
      [self shouldShowSelectionView:NO]; 
      break; 
    } 
} 

Я знаю, что это кажется Hacky, но это единственный способ, которым я мог бы получить такое поведение. Надеюсь, что это помогает и удачи!

+0

Отлично, спасибо за помощь. – melody5417

+0

Если это ответит на ваш вопрос, пожалуйста, примите этот ответ. – rocky

+0

Извините, но я уже принял этот ответ. Я щелкнул вверх, тогда этот ответ будет отмечен как принятый, не так ли? Извините, если это не правильно, я исправлю это. – melody5417

Смежные вопросы