我正在尝试使用多行单元格实现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中所示。看起来细胞的大小正确,但不会压下下面的细胞。
有人可以帮助我吗?
答案 0 :(得分:1)
在我的脑海中,我很确定只在重新加载表格单元格的数据时调用此委托方法,而不是在其他事件(如边界更改)期间调用。
当需要调整行高时,您需要调用重新加载,这将导致表为每个可见单元格调用此方法,从而执行调整大小。
答案 1 :(得分:1)
(这是作为suggested edit发布的,但应该是它自己的答案。我不知道它是否有意义。@ asavartsov:随时重新发布这个答案是你自己的,并留下评论,所以我会删除这个副本。)
每当有人询问项目的行高时,此代理就会调用。这种情况尤其发生在绘图操作中,这些操作由边界变化而变化。但是,正如文档中所述,
NSTableView
可以缓存此方法返回的值,因此如果要更改行的高度,请确保通过调用noteHeightOfRowsWithIndexesChanged:
使行高无效。NSTableView
会自动使reloadData
和noteNumberOfRowsChanged
中的整个行高缓存无效。
当需要调整行高时,您需要调用noteHeightOfRowsWithIndexesChanged:
或reload
,这将导致表为每个可见单元格调用此方法,从而执行调整大小