2 Stimmen

Finder-Style gleitende Gruppenzeilen in ansichtsbasierter NSOutlineView

Ich habe in meinem Projekt eine View-basierte NSOutlineView implementiert. Ich verwende gleitende Gruppenzeilen. Nun möchte ich, dass diese NSOutlineView im Grunde wie die Finder-Listenansicht (CMD-2) aussieht, wenn sie sich im "arranged-by"-Layout befindet (z.B. "by kind": CTRL-CMD-2). Das heißt, die oberste Gruppenzeile sollte die Spaltentitel anzeigen und sobald die nächsttiefere Gruppenzeile beginnt, die vorherige aus der Ansicht zu verdrängen, werden die Spaltentitel in der zweiten Gruppenzeile eingeblendet (ich hoffe, das macht Sinn).

Gibt es eine Möglichkeit, dies zu erreichen? Bisher habe ich erfolgreich NSTableCellView subclassed, um die Spalten Titel zeigen, aber ich kann nicht bekommen, die Einblendung zu arbeiten, wie ich nicht scheinen, um die Position der Gruppe Zeile in Bezug auf die schwebende darüber herauszufinden.

Herzliche Grüße, Michael

0voto

Michael Becker Punkte 335

Ich habe einen Weg gefunden, um das zu erreichen, was ich will. In meiner benutzerdefinierten NSTableCellView's drawRect: Methode ist es natürlich möglich, auf eine unangenehme Art und Weise, um die Position der Ansicht relativ zu den umschließenden NSClipView herauszufinden. Der relevante Code:

- (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.
      // 
    }
  }
}

Ich hoffe, das macht Sinn ;-). Für Tipps bin ich nach wie vor dankbar!

Zum Wohl, Michael

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X