尝试生成透明的NSTableView标头时NSTableHeaderView和NSTableHeaderCell的消息流问题

时间:2015-12-24 19:27:16

标签: objective-c macos cocoa nstableheaderview nstableheadercell

问题:我正在尝试创建自定义透明TableView标头,我创建了NSTableHeaderViewNSTableHeaderCell的子类并覆盖了-drawWithFrame:inView-drawInteriorWithFrame:inView子类中的NSTableHeaderCell。这些方法按预期工作,但仅在首次绘制表列标题时才有效。但是,在用户单击表标题后,它将以白色背景重新绘制。为了具体,以下是自定义方法实现:

@interface MYTableHeaderCell : NSTableHeaderCell
@end

@implementation MYTableHeaderCell

-(void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView{
//[super drawWithFrame:cellFrame inView:controlView];
NSBezierPath *path = [NSBezierPath bezierPathWithRect:cellFrame];
NSColor *clearColor = [NSColor clearColor];
[clearColor setFill];
[path fill];
[self drawInteriorWithFrame:cellFrame inView:controlView];
}

-(void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView{
//[super drawInteriorWithFrame:cellFrame inView:controlView];
NSBezierPath *path = [NSBezierPath bezierPathWithRect:cellFrame];
NSColor *clearColor = [NSColor clearColor];
[clearColor setFill];
[path fill];
NSRect titleRect = [self titleRectForBounds:cellFrame];
[self.attributedStringValue drawInRect:titleRect];
}

-(NSColor *)highlightColorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView{
return [NSColor clearColor];
}

-(BOOL)isOpaque{
return NO;
}

首次绘制表格视图标题时,它 has a transparent background as intended. 然而,点击标题之后,它就是 redrawn to have a white background.

据我所知,点击表格视图标题后

-drawInteriorWithFrame:inView: 
需要绘制标题时仍会调用

。但是,

-drawWithFrame:inView: 

不是。另外一个类似乎是在单元格文本下面绘制一个白色视图。

我查看了NSTableHeaderCellNSTableHeaderView课程说明及其所有superclasses,但我无法弄清楚为什么要绘制白色背景。我显然缺少一些基本的东西。

问题:是什么导致绘制白色视图?

1 个答案:

答案 0 :(得分:0)

highlight(flag: Bool, withFrame cellFrame: NSRect, inView controlView: NSView)

方法未实现。重写此方法并从那里的drawRect方法中复制代码,这应该完成。