2016-04-25 137 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

所選顏色覆蓋圖像和按鈕。我GOOGLE了,但沒有發現任何想法。感謝您的幫助〜

回答

1

所以這有點棘手。策略是在NSTableCellView中使用alpha小於1的疊加彩色視圖,然後根據單元的選擇來添加和刪除它。

首先,你需要,可以設置背景顏色的的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; 
    } 
} 

,在你NSTableCellView子類這增加的drawRect:

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

Final LY,覆蓋NSTableCellView:setBackgroundStyle:

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

我知道這似乎哈克,但這是我能得到這種行爲的唯一途徑。希望這會有所幫助,祝你好運!

+0

完美,真的非常感謝您的幫助。 – melody5417

+0

如果這回答你的問題,請接受這個答案。 – rocky

+0

對不起,但我已經接受了這個答案。我點擊了uparrow,那麼這個答案將被標記爲接受,對嗎?對不起,如果這不是正確的方法,我會糾正它。 – melody5417

相關問題