結果比我預想的要容易。這是解決方案的草圖。若要縮進比大綱列之外的列在NSOutlineView,您可以:
- 創建您將使用該列的的NSCell類的子類,說MYIndentedCell
- 添加一個實例變量
indentation
到MYIndentedCell,並提供一個存取和mutator方法爲它
- 覆蓋至少drawWithFrame:inView:在MYIndentedCell到:
- (void) drawWithFrame: (NSRect) frame inView: (NSView*) view
{
NSRect newFrame = frame;
newFrame.origin.x += indentation;
newFrame.size.width -= indentation;
[super drawWithFrame: newFrame inView: view];
}
- 您還需要重寫和
selectWithFrame:inView:
類似上面如果列都可以編輯
- 覆蓋CELLSIZE到:
- (NSSize) cellSize
{
NSSize cellSize = [super cellSize];
cellSize.width += indentation;
return cellSize;
}
- 最後,得到了壓痕列跟隨NSOutlineView的大綱列的縮進將由大綱視圖的委託來處理。委託需要實現以下:
- (void) outlineView: (NSOutlineView *) view
willDisplayCell: (id) cell
forTableColumn: (NSTableColumn *) column
item: (id) item
{
if (column == theColumnToBeIndented) {
[cell setIndentation:
[view indentationPerLevel] * [view levelForItem: item]];
}
}
如果您仍然無法得到它的工作,你可能要採取蘋果的SourceView sample code看看ImageAndTextCell.m
,我發現在搞清楚如何很有幫助做到以上。