带有文本环绕单元格的NSOutlineView:heigthOfRow

时间:2011-03-24 08:43:49

标签: cocoa nsoutlineview

我正在尝试使用多行单元格实现NSOutlineView

根据本网站和其他网站的建议,我在视图的委托中提出了以下代码。

- (CGFloat)outlineView:(NSOutlineView *)outlineView heightOfRowByItem:(id)item {
    NSTableColumn *column = [outlineView outlineTableColumn];
    NSCell *cell = [column dataCell];

    [cell setStringValue:[item valueForKey:@"label"]];

    return [cell cellSizeForBounds:NSMakeRect(0.0, 0.0, [column width], CGFLOAT_MAX)].height;
}

大纲表列中的单元格设置为换行。

然而,我得到一个奇怪的图形行为 - 文本行重叠,如http://screencast.com/t/ewJUwRmlGZqh中所示。看起来细胞的大小正确,但不会压下下面的细胞。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

在我的脑海中,我很确定只在重新加载表格单元格的数据时调用此委托方法,而不是在其他事件(如边界更改)期间调用。

当需要调整行高时,您需要调用重新加载,这将导致表为每个可见单元格调用此方法,从而执行调整大小。

答案 1 :(得分:1)

(这是作为suggested edit发布的,但应该是它自己的答案。我不知道它是否有意义。@ asavartsov:随时重新发布这个答案是你自己的,并留下评论,所以我会删除这个副本。)

每当有人询问项目的行高时,此代理就会调用。这种情况尤其发生在绘图操作中,这些操作由边界变化而变化。但是,正如文档中所述,

  

NSTableView可以缓存此方法返回的值,因此如果要更改行的高度,请确保通过调用noteHeightOfRowsWithIndexesChanged:使行高无效。 NSTableView会自动使reloadDatanoteNumberOfRowsChanged中的整个行高缓存无效。

当需要调整行高时,您需要调用noteHeightOfRowsWithIndexesChanged:reload,这将导致表为每个可见单元格调用此方法,从而执行调整大小