思ったより簡単だった。これが解決策のスケッチです。NSOutlineViewのアウトライン列以外の列をインデントするには、次のことができます。
- その列に使用するNSCellクラスのサブクラス(MYIndentedCellなど)を作成します
- インスタンス変数
indentation
をMYIndentedCellに追加し、それにアクセサーとミューテーターメソッドを提供します
- MYIndentedCellの少なくともdrawWithFrame:inView:を次のようにオーバーライドします。
-(void)drawWithFrame:(NSRect)frame inView:(NSView *)view
{{
NSRectnewFrame=フレーム;
newFrame.origin.x+=インデント;
newFrame.size.width-=インデント;
[スーパーdrawWithFrame:newFrame inView:ビュー];
}
- 列が編集可能である場合は、上記
editWithFrame:inView
と同様にオーバーライドする必要がありますselectWithFrame:inView:
- cellSizeを次のようにオーバーライドします。
-(NSSize)cellSize
{{
NSSize cellSize=[スーパーcellSize];
cellSize.width+=インデント;
cellSizeを返します。
}
- 最後に、NSOutlineViewのアウトライン列のインデントに続く列のインデントを取得することは、アウトラインビューのデリゲートによって処理されます。デリゲートは、以下を実装する必要があります。
-(void)outlineView:(NSOutlineView *)ビュー
willDisplayCell:(id)セル
forTableColumn:(NSTableColumn *)列
アイテム:(id)アイテム
{{
if(column == theColumnToBeIndented){
[セルsetIndentation:
[view indentationPerLevel] * [view levelForItem:item]];
}
}
それでも問題が解決しない場合はImageAndTextCell.m
、AppleのSourceViewサンプルコードを参照してください。これは、上記の方法を理解するのに非常に役立ちます。