我在我的项目中实现了基于视图的NSOutlineView。我正在使用浮动组行。现在,我希望此NSOutlineView处于“按排列”布局(例如“按种类”:CTRL-CMD-2)时,基本上看起来像Finder列表视图(CMD-2)。这就是说,最上面的组行应该显示列标题,而下一个下组行开始将前一个列移出视图时,列标题就会淡入第二组行中(我希望这会使感)。
有没有现成的方法可以实现这一目标?到目前为止,我已经成功地将NSTableCellView子类化以显示列的标题,但是,由于似乎无法找出组行相对于其上方的浮动行的位置,因此我无法使渐入式工作正常。
问候,
麦可
最佳答案
我找到了实现我想要的方法的一种可能。在我自定义的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.
//
}
}
}
我希望这是有道理的 ;-)。任何提示仍然感激!
干杯,
麦可