27

私はプロジェクトに NSOutlineView を使用していますが、2 つのことを理解できないようです。

  • ツリー ノードの開閉用三角ボタンを削除する方法。iTunes などのアプリでは、次のことができるようです。

代替テキスト

これに使用されるある種の NSOutlineView Delegate メソッドはありますか? それともサブクラスが必要ですか?

  • アイテムのインデントを無効にする方法。setIndentationPerLevel:を使用して 0 に設定し、Interface Builder で列のインデントを 0 に変更しようとしましたが、効果がないようです。
4

8 に答える 8

44

あなたはここで適切な人に出くわしました。私はちょうど一週間前にこれに取り組まなければなりませんでした。

開示三角形の削除:サブクラスにframeOfOutlineCellAtRow:メソッドを実装して戻ります(もちろん、特定の行の三角形を非表示にする場合のみ)。NSOutlineViewNSZeroRect

- (NSRect)frameOfOutlineCellAtRow:(NSInteger)row {
    return NSZeroRect;
}

インデントを無効にする : アイテムが展開可能な場合、アウトライン ビューの標準レイアウトでは、三角形を描画するために左端にスペースが確保されます。ただし、別の描画フレームを指定することで、個々のアイテムに対してそれをオーバーライドできます。このメッセージに応答して、サブクラスでもそれを行います。

- (NSRect)frameOfCellAtColumn:(NSInteger)column row:(NSInteger)row {
    NSRect superFrame = [super frameOfCellAtColumn:column row:row];


    if ((column == 0) /* && isGroupRow */) {
        return NSMakeRect(0, superFrame.origin.y, [self bounds].size.width, superFrame.size.height);
    }
    return superFrame;
}
于 2010-11-23T01:59:04.127 に答える
38

今後の参考のために、展開可能なNSOutlineViewアイテムで開閉用三角ボタンを非表示にする最もクリーンで簡単な方法は、デリゲートでNSOutlineViewDelegateプロトコルのOutlineView:shouldShowOutlineCellForItem:メソッドを実装することです。

-(BOOL)outlineView:(NSOutlineView *)outlineView shouldShowOutlineCellForItem:(id)item
{
    // replace this with your logic to determine whether the
    // disclosure triangle should be hidden for a particular item
    return [item hidesDisclosureTriangle];
}
于 2011-05-30T17:29:42.380 に答える
9

上記の 2 つのアプローチを組み合わせる必要がありました。outlineView:shouldShowOutlineCellForItem:単独では開示三角形用に予約されたスペースが削除されないためです (三角形自体が削除されます)。

代理人:

- (BOOL)outlineView:(NSOutlineView *)outlineView shouldShowOutlineCellForItem:(id)item {
    return NO;
}

NSOutlineView のサブクラス:

@implementation ExpandedOutlineView

#define kOutlineCellWidth 11
#define kOutlineMinLeftMargin 6

- (NSRect)frameOfCellAtColumn:(NSInteger)column row:(NSInteger)row {
    NSRect superFrame = [super frameOfCellAtColumn:column row:row];
    if (column == 0) {
        // expand by kOutlineCellWidth to the left to cancel the indent
        CGFloat adjustment = kOutlineCellWidth;

        // ...but be extra defensive because we have no clue what is going on here
        if (superFrame.origin.x - adjustment < kOutlineMinLeftMargin) {
            NSLog(@"%@ adjustment amount is incorrect: adjustment = %f, superFrame = %@, kOutlineMinLeftMargin = %f", NSStringFromClass([self class]), (float)adjustment, NSStringFromRect(superFrame), (float)kOutlineMinLeftMargin);
            adjustment = MAX(0, superFrame.origin.x - kOutlineMinLeftMargin);
        }

        return NSMakeRect(superFrame.origin.x - adjustment, superFrame.origin.y, superFrame.size.width + adjustment, superFrame.size.height);
    }
    return superFrame;
}

@end

結果:

トップレベルのインデントがない NSOutlineView のスクリーンショット

于 2013-05-20T05:36:59.907 に答える
2

PXSourceListを使用します。それはあなたがとても素敵なAPIで探しているスタイルです。

于 2010-11-23T04:27:22.887 に答える