2

在我的 NSOutlineview 中,我使用的是从 NSTextFieldCell 子类化的自定义单元格,我需要为组行和普通行绘制不同的颜色,当它被选中时,

为此,我做了以下工作,

-(id)_highlightColorForCell:(NSCell *)cell
{
    return [NSColor colorWithCalibratedWhite:0.5f alpha:0.7f];
}

是的,我知道它的私有 API,但我找不到任何其他方式,这对普通行非常有效,但对组行没有影响,有没有办法改变组颜色,

亲切的问候罗汉

4

1 回答 1

4

您实际上可以在不依赖私有 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];
  }
}
于 2011-02-19T03:36:04.710 回答