【问题标题】:How to make an NSOutlineView indent multiple columns?如何使 NSOutlineView 缩进多列?
【发布时间】:2010-03-10 19:37:04
【问题描述】:

使NSOutlineView 缩进多列的最简单或推荐的方法是什么?默认情况下,它只缩进大纲列;据我所知,没有内置支持使其缩进其他列。

我有一个 NSOutlineView,它显示了两组分层数据之间的比较。为了视觉吸引力,如果大纲列中的某些项目是缩进的,我想将另一列中同一行上的项目缩进相同的缩进量。 (还有第三列显示比较两个项目的结果,此列不应该缩进。)

这只能通过继承 NSOutlineView 来实现吗?在子类中需要覆盖什么?或者有没有更简单的方法让它缩进多列?

【问题讨论】:

    标签: cocoa nsoutlineview


    【解决方案1】:

    结果比我预期的要容易。这是解决方案的草图。要在 NSOutlineView 中缩进除大纲列之外的列,您可以:

    • 创建将用于该列的 NSCell 类的子类,例如 MYIndentedCell
    • 将实例变量indentation添加到MYIndentedCell,并为其提供访问器和修改器方法
    • 至少将 MYIndentedCell 中的 drawWithFrame:inView: 覆盖为:
    - (void) drawWithFrame: (NSRect) frame inView: (NSView*) view { NSRect newFrame = 框架; newFrame.origin.x += 缩进; newFrame.size.width -= 缩进; [超级drawWithFrame:newFrame inView:view]; }
    • 如果列可编辑,您还需要覆盖 editWithFrame:inViewselectWithFrame:inView:,类似于上述内容
    • 将 cellSize 覆盖为:
    - (NSSize) 细胞大小 { NSSize cellSize = [超级 cellSize]; cellSize.width += 缩进; 返回单元格大小; }
    • 最后,使列中的缩进跟随 NSOutlineView 的大纲列的缩进将由大纲视图的委托处理。委托需要实现以下内容:
    - (void) outlineView: (NSOutlineView *) 视图 willDisplayCell: (id) 单元格 forTableColumn: (NSTableColumn *) 列 项目:(id)项目 { if (column == theColumnToBeIndented) { [单元格设置缩进: [view indentationPerLevel] * [view levelForItem: item]]; } }

    如果您仍然无法使其正常工作,您可能需要查看 Apple 的 SourceView sample code 中的 ImageAndTextCell.m,我发现它对了解如何执行上述操作非常有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 2021-05-08
      相关资源
      最近更新 更多