如何将NSOutlineView的最后一个树项保留在补充工具栏的最底部?

时间:2009-08-25 11:38:19

标签: cocoa tree sidebar nsoutlineview outline-view

我希望在Things应用程序中完成与特殊项目相同的行为。我的意思是补充工具栏底部的 Logbook Trash 项目:

Logbook and Trash items are in the most bottom http://tinyurl.com/lhctza

请建议以任何方式在侧栏树中实现相同的功能。

我觉得特殊的'spacer'树项应该与outlineView:heightOfRowByItem:方法一起使用。

但是,我找不到如何计算所有可见项目的总高度(包括组间空间)。

2 个答案:

答案 0 :(得分:3)

您可以尝试简单地使用两个轮廓视图:一个固定高度,固定在超视图的底部,另一个是可变高度,其底部位于第一个顶部的顶部。固定高度的轮廓视图将包含那些日志和废纸篓项目,可变高度轮廓视图将包含所有其他项目。

棘手的部分是通过滚动视图使这个游戏变得漂亮,但我认为你可以做到。我想你会把它们都放在一个完全可调整大小的NSView中,然后把它作为滚动视图的文档视图。

答案 1 :(得分:1)

我决定通过为组样式中的每个根项添加8个像素的高度来对解决方案进行硬编码。 所以,代码看起来像这样:

- (CGFloat)outlineView:(NSOutlineView *)ov heightOfRowByItem:(id)item;
{
    if (![item isSpacer]) return [ov rowHeight];

    static const CGFloat ADDITIONAL_SPACE = 8.0f;
    NSUInteger numberOfRootGroups = 2;
    CGFloat heightOfRows = [ov rowHeight] * ([ov rowForItem:item] + 1) 
        + ADDITIONAL_SPACE * numberOfRootGroups;
    CGFloat heightOfSidebar = [[ov superview] frame].size.height;
    return MAX(0.0f, heightOfSidebar - heightOfRows);
}

感谢大家的支持!