在我的NSOutlineview中,我使用的是从NSTextFieldCell继承的自定义单元格, 我需要为组行和正常行绘制不同的颜色,当它被选中时,
为此,我做了以下,
-(id)_highlightColorForCell:(NSCell *)cell
{
return [NSColor colorWithCalibratedWhite:0.5f alpha:0.7f];
}
是的,我知道它的私有API,但我找不到任何其他方式, 这对于Normal Row非常有效,但对Group Row没有影响,有没有办法改变组颜色,
亲切的问候 罗汉
答案 0 :(得分:3)
您实际上可以在不依赖私有API的情况下执行此操作,至少如果您愿意需要Mac OS X 10.4或更高版本。
将以下内容放入您的单元格子类中:
- (NSColor *)highlightColorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
// Returning nil circumvents the standard row highlighting.
return nil;
}
然后继承NSOutlineView并重新实现该方法, - (void)highlightSelectionInClipRect:(NSRect)clipRect;
这是一个为非组行绘制一种颜色而为组行绘制另一种颜色的示例
- (void)highlightSelectionInClipRect:(NSRect)clipRect
{
NSIndexSet *selectedRowIndexes = [self selectedRowIndexes];
NSRange visibleRows = [self rowsInRect:clipRect];
NSUInteger selectedRow = [selectedRowIndexes firstIndex];
while (selectedRow != NSNotFound)
{
if (selectedRow == -1 || !NSLocationInRange(selectedRow, visibleRows))
{
selectedRow = [selectedRowIndexes indexGreaterThanIndex:selectedRow];
continue;
}
// determine if this is a group row or not
id delegate = [self delegate];
BOOL isGroupRow = NO;
if ([delegate respondsToSelector:@selector(outlineView:isGroupItem:)])
{
id item = [self itemAtRow:selectedRow];
isGroupRow = [delegate outlineView:self isGroupItem:item];
}
if (isGroupRow)
{
[[NSColor alternateSelectedControlColor] set];
} else {
[[NSColor secondarySelectedControlColor] set];
}
NSRectFill([self rectOfRow:selectedRow]);
selectedRow = [selectedRowIndexes indexGreaterThanIndex:selectedRow];
}
}