Строки с плавающей группой в стиле Finder в NSOutlineView на основе представления - PullRequest
2 голосов
/ 04 января 2012

В моем проекте реализован NSOutlineView на основе представления.Я использую плавающие группы строк.Теперь я хотел бы, чтобы этот NSOutlineView выглядел в основном как список списка Finder (CMD-2), когда он находится в расположении «по порядку» (например, «по виду»: CTRL-CMD-2).Это означает, что в самой верхней строке группы должны отображаться заголовки столбцов, и как только следующая нижняя строка группы начинает вытеснять предыдущую из вида, заголовки столбцов исчезают во второй строке группы (надеюсь, этосмысл).

Есть ли какой-нибудь из готовых способов добиться этого?До сих пор я успешно разделил NSTableCellView на подклассы, чтобы показать заголовки столбцов, однако я не могу заставить работать постепенное появление, поскольку я не могу определить положение строки группы относительно плавающей над ней.

С уважением, Майкл

1 Ответ

0 голосов
/ 09 января 2012

Я нашел способ добиться того, чего хочу.В моем собственном методе drawRect: метод NSTableCellView, конечно, возможно, неприятно узнать положение представления относительно окружающего 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.
      // 
    }
  }
}

Надеюсь, это имеет смысл ;-).Любые советы по-прежнему приветствуются!

Ура, Майкл

...