基于视图的NSOutlineView中的Finder样式浮动组行

时间:2012-01-04 00:56:19

标签: cocoa nsoutlineview

我在我的项目中实现了基于视图的NSOutlineView。我正在使用浮动组行。现在,我希望这个NSOutlineView看起来基本上像Finder列表视图(CMD-2),当它处于“排列”布局时(例如“按种类”:CTRL-CMD-2)。这意味着,最顶层的组行应该显示列标题,并且一旦下一个较低的组行开始轻推视图中的前一个,列标题就会在第二组行中淡入(我希望这会使义)。

有没有开箱即用的方法来实现这一目标?到目前为止,我已经成功地将NSTableCellView子类化以显示列的标题,但是,我无法使淡入效果工作,因为我似乎无法找到与其上方的浮动组相关的组行的位置。

此致 迈克尔

1 个答案:

答案 0 :(得分:0)

我找到了实现我想要的方法。在我的自定义NSTableCellView的drawRect:方法中,它当然可能以令人讨厌的方式找出视图相对于封闭的NSClipView的位置。相关代码:

- (void)drawRect:(NSRect)dirtyRect {
  // _isGroupView is a member variable which has to be set previously
  // (usually in setObjectValue:) in order for us to know if we're a 
  // group row or not.
  if (_isGroupView) {

    // This is the nasty party:
    NSClipView *clipView = (NSClipView*)self.superview.superview.superview;
    if (![clipView isKindOfClass:[NSClipView class]]) {
      NSLog(@"Error: something is wrong with the scrollbar view hierarchy.");
      return;
    }

    NSRect clipRect = [clipView documentVisibleRect];
    CGFloat distanceToTop = self.superview.frame.origin.y - clipRect.origin.y;
    if (self.superview.frame.origin.y - clipRect.origin.y < self.frame.size.height) {
      // This means, that this NSTableCellView is currently pushing the
      // view above it out of the frame.

      CGFloat alpha = distanceToTop / self.frame.size.height;
      NSColor *blendColor = [[NSColor blackColor] blendedColorWithFraction:alpha    ofColor:[NSColor whiteColor]];

      // ...
      // do stuff with blendColor
      // ...
      // blendColor should now be the appropriate color for the wanted 
      // "fade in" effect.
      // 
    }
  }
}

我希望这是有道理的;-)。任何提示仍然受到赞赏!

干杯, 迈克尔