5

HUDパネルにあるNSOutlineViewを使用しています。背景を描画しないように設定しました。セルを編集するためにダブルクリックするまで、すべてが正常に見えます。フィールドエディタは、ユーザーエクスペリエンス全体を完全に台無しにする背景とフォーカスリングを描画します。

これは、NSTextFieldCellのサブクラスで行っていることです。

- (NSText *)setUpFieldEditorAttributes:(NSText *)textObj
{   
    NSText *text = [super setUpFieldEditorAttributes:textObj];

    [text setDrawsBackground:YES];
    [text setBackgroundColor:[NSColor darkGrayColor]];

    return text;
}

setDrawsBackground:NOを使用すると、完全に無視され、背景が白になります。色のアルファコンポーネントに触れることができないため、私の解決策は決して良いものではありません(そうすると、フィールドエディタは別の色を背景として使用します)が、少なくとも白い背景は得られません。

この問題の実際の解決策があるかどうか疑問に思います。独自のフィールドエディタを提供する必要がありますか?その価値はありますか?

私が欲しいのは、背景やフォーカスリングがなく、カーソルが点滅しているだけのフィールドエディタです。

ありがとう!

4

2 に答える 2

4

問題は、-editColumn:row:withEvent:select:が送信されたときに、NSTableViewによって白い背景が描画されることです。セルの長方形を+[NSColortextBackgroundColor]で塗りつぶします。

開発者の色空間から名前付き色の現在の設定をオーバーライドするためのパブリックAPIがある場合は、-editColumn:row:withEvent:select:などのオーバーライド内に設定できます。私はそのようなAPIを思い出しません(ポインターは大歓迎です)。また、このコードはSnow Leopardでのみテストしました(以下のLeopard SDKの補遺でも)。サポートする予定の実際のSDKおよびランタイム環境に対してコードを確認します。

NSTableViewには、塗りつぶしの色に使用するプライベートアクセサーがありますが、これは読み取り専用のプロパティです。セッターがないため、標準のNSTableViewの値を変更することはできません。サブクラス化する必要があります。(outlineViewで同じ動作が必要であり、NSOutlineViewはすでにNSTableViewのサブクラスであるため、NSOutlineViewをサブクラス化します。ただし、スーパークラスを除いて、コードは同じです。)

@interface ASCOutlineView : NSOutlineView {

}

@end

@implementation ASCOutlineView

- _textBackgroundColor
{
    return  ([NSColor clearColor]);
}

@end

Snow Leopardでテーブルセルを編集するときに、そのまぶしい白いブロックがHUDを台無しにするのを防ぐために必要なのはすべてのようです。

ただし、Leopard SDKに対してコンパイルされたアプリには、もう少しサポートが必要です。LeopardのtableViewsには、一部のレンダリングプロパティがハードコーディングされている可能性があるため、choiceメソッドをオーバーライドする必要があります。

NSTextFieldCellsは、実際にはNSTextViewsのラッパーであるため、コントロール内で使用できます。これらは通常、ウィンドウ(またはこの場合はそのサブクラスであるパネル)によって管理される同じtextViewインスタンスを共有します。NSTableViewは、データを編集するためのシステムUI設定に準拠するようにNSTextFieldCellの設定を変更します。多くの場合。次に、NSTextFieldCellはそれらの設定をNSTextViewに伝播します。このパイプラインに沿った任意の時点で、1つまたは2つのメソッドをオーバーライドして、独自のUIに一致するようにこれらのプロパティの値を変更できます。

-[NSTextFieldCell setDrawsBackground:]を使用します。これは、修正するのにほとんど労力を必要としないためです。また、他のオブジェクトがその状態に依存する可能性がある場合に、内部状態を達成したいと考えている効果と一致させることも重要です。

@interface ASCTextFieldCell : NSTextFieldCell {

}

@end

@implementation ASCTextFieldCell

- (void)setDrawsBackground: (BOOL)flag
{
    [super setDrawsBackground: NO];
}

@end

また、セルの編集中にフォーカスリングが表示されないようにするのは、フォーカスリングタイプの設定を変更するだけです。苛立たしいことに、IBはこのプロパティへのアクセスを提供しないため、プログラムで実行する必要があります。

for(eachColumn in [hudOutlineView tableColumns])
{
    columnCell = [[ASCTextFieldCell alloc] initTextCell: @""];
    [eachColumn setDataCell: columnCell];

    if([columnCell respondsToSelector: @selector(setFocusRingType:)] != NO)
        [(NSTextFieldCell *)columnCell setFocusRingType: NSFocusRingTypeNone];
}
于 2011-06-10T06:59:51.837 に答える
0

白く描かれているフィールドエディタの背後に他の背景があるようです。おそらく、NSCell、または行の背景、その他何でも。

于 2011-06-09T08:20:03.720 に答える