2011-03-27 8 views
4

私はHUDパネルにあるNSOutlineViewを使っています。背景を描かないように設定しました。ダブルクリックしてセルを編集するまでは、すべてうまく見えます。 フィールドエディタは、全体のユーザーエクスペリエンスを完全に破壊するバックグラウンドとフォーカスリングを描画します。NSOutlineView with transparent field editor

これは私がNSTextFieldCellのサブクラスでやってるものです:

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

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

    return text; 
} 

私はsetDrawsBackgroundを使用している場合:NOそれは完全に無視し、私は白の背景を取得しています。私の解決策は、色のアルファ成分に触れないためです(私がそれを行うと、フィールドエディタは背景として別の色を使用します)が、少なくとも私は白い背景を得ません。

この問題の実際の解決策があるのでしょうか。自分のフィールドエディタを用意する必要がありますか?その価値はありますか?

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

ありがとうございます!

答えて

4

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

開発者のカラースペースから名前付きカラーの現在の設定をオーバーライドするパブリック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のtableViewは、レンダリングプロパティをハードコードしているので、選択メソッドをオーバーライドする必要があります。

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]; 
} 
0

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