2012-11-21 21 views
5

NSOutlineViewをソースリストスタイルで使用しています。ビューベース(セルベースではなく)のアウトラインビューを使用しています。NSOutlineViewソースリストのスタイル、ビューベース、フォントの変更

私はいくつかの行を太字にしたいと考えています。しかし、私がフォントを変更しようとする試み(これは、IBで手動で、viewForTableColumn:...またはFont Boldバインディングを通して)はこれまで無視されていました。

私はあなたがテキストフィールドのコンセントにあなたのテキストフィールドをフックアップしたことを推測している:this messageから

は、NSOutlineViewのソースリストスタイルは、テキストフィールドの外観を管理を引き継ぐためであると表示されますNSTableCellViewの?もしそうなら、NSTableViewのソースリストの外観の自動管理を実行している可能性があります。

textFieldアウトレットからテキストフィールドを切り離し、カスタムフォントが付いているかどうかを確認してください。

textFieldアウトレットを切断すると、外観が私のコントロール下にあり、私の誇張が働きます。

しかし、私はそれを自動のもののように見せることはできません。つまり、NSOutlineViewがテキストフィールドの外観を管理していたときに、フォントが太字であり、項目が選択されたときにドロップシャドウが得られましたが、手動で管理しているときはそうではありません。

誰もがこれらの質問のいずれかを答えることができます:

  1. 私はNSOutlineViewは私のテキストフィールド
  2. の外観を管理しているとき、私は持っていない場合は動作するように結合フォントが太字取得できますかNSOutlineView管理私のテキストフィールドの外観、私はそれを見えるようにすることができ、私はそれを管理していたかのように振る舞いますか?それが含まれているコントロールの細胞にbackgroundStyleプロパティを設定することでtextFieldアウトレットだの

    NSTableCellViewは外観を管理します:

+0

質問がありましたので質問がありましたか?私も同様の問題があります:( –

+0

フォントを変更するのではなく、あきらめてアイコンを使用したと思いますが、それは可能かもしれませんが、決して見つけられませんでした。 –

答えて

6

は、私は解決策を見つけたと思います。これをNSBackgroundStyleDarkに設定すると、NSTextFieldCellの特別なパスが発生し、基本的にはattributedStringValueに設定され、テキストの色が変更され、NSShadowAttributeNameでシャドウが追加されます。カスタム行またはセルのビューのサブクラスで独自にbackgroundStyleを設定

  • :あなたは何ができるか

    は二つのことです。

  • セルのテキストフィールドにカスタムNSTextFieldCellを使用し、動作/描画を変更します。

私たちは、テーマの異なる(色が違う)テーブルビューを必要としていたので、後者を行いました。

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView 
{ 
    NSAttributedString *originalString = self.attributedStringValue; 

    // Customize string as you like 
    if (/* whatever */) 
     [self setAttributedStringValue: /* some string */]; 

    // Regular drawing 
    [super drawInteriorWithFrame:cellFrame inView:controlView]; 

    // Reset string 
    if (self.attributedStringValue != originalString) 
     self.attributedStringValue = originalString; 
} 

ご希望の場合は、これは類似したに他の人を助けることがあります。これは- drawInteriorWithFrame:inView:をオーバーライドし、スーパー・メソッドをコールする前に、セルの属性付き文字列を変更し、その後、元を復元したため、我々は見出した(確かに、最も効率的ではないが)最も便利な場所状況。

+0

ありがとうございました。 – Tommy

0

私はあなたの質問に何かを見逃しているが、私のために、次の作品を使用してフォントを変更するかどうかはわかりません。 ReminderTableCellViewはNSTableCellViewのサブクラスで、追加のdateFieldが追加されています。

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    //LOG(@"viewForTableColumn called"); 
    // For the groups, we just return a regular text view. 
    if ([_topLevelItems containsObject:item]) { 
     //LOG(@" top level"); 
     NSTableCellView *result = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 
     // Uppercase the string value, but don't set anything else. NSOutlineView automatically applies attributes as necessary 
     NSString *value = [item uppercaseString]; 
     [result.textField setStringValue:value]; 
     //[result.textField setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; 
     return result; 
    } else { 
     //LOG(@" menu item"); 
     // The cell is setup in IB. The textField and imageView outlets are properly setup. 
     // Special attributes are automatically applied by NSTableView/NSOutlineView for the source list 
     ReminderTableCellView *result = [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 
     if ([item isKindOfClass:[OSTreeNode class]]) { 
      [result.textField setFont:[NSFont boldSystemFontOfSize:13]]; 
      result.textField.stringValue = [item displayName]; 
      result.dateField.stringValue = [item nextReminderDateAsString]; 
     } 
     else 
      result.textField.stringValue = [item description]; 
     if (_loading) 
      result.textField.textColor = [NSColor grayColor]; 
     else 
      result.textField.textColor = [NSColor textColor]; 
     NSImage *image = [NSImage imageNamed:@"ReminderMenuIcon.png"]; 
     [image setSize:NSMakeSize(16,16)]; 
     [result.imageView setImage:image]; 
     //[result.imageView setImage:nil]; 
     return result; 
    } 
} 

結果ビューは次のとおりです。これはNSOutlineView with Source Listingオプションが選択されていることに注意してください。しかし、なぜこれが通常のoutlineViewに対して機能しないのか分かりません。

enter image description here

関連する問題