代码之家  ›  专栏  ›  技术社区  ›  Vadim

如何将nsoutlineview的最后一个树项保留在边栏的最底部?

  •  5
  • Vadim  · 技术社区  · 15 年前

    我希望特殊项目的行为与在Things应用程序中所做的相同。我的意思是 航海日志 废物箱 边栏底部的项目:

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

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

    我觉得特别的间隔木应该和 outlineView:heightOfRowByItem: 方法。

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

    2 回复  |  直到 15 年前
        1
  •  3
  •   Peter Hosey    15 年前

    您可以尝试简单地拥有两个大纲视图:一个是固定高度的视图,固定在其超级视图的底部,另一个是可变高度的视图,其底部直接位于第一个视图的顶部之上。固定高度大纲视图将包含这些日志和垃圾项目,可变高度大纲视图将包含所有其他项目。

    最棘手的部分是让这个游戏在滚动视图中表现得很好,但我认为你可以做到。我想你会把它们放在一个完全可调整大小的nsview中,并使之成为滚动视图的文档视图。

        2
  •  1
  •   Vadim    15 年前

    我决定用组样式为每个根项目添加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);
    }
    

    感谢大家的支持!

    推荐文章