2012-11-21 14 views
5

Korzystam z widoku NSOutlineView ze stylem listy źródłowej i widoku widoku opartego na widoku (a nie na komórce).Styl listy źródeł NSOutlineView, oparte na widoku, zmiana czcionki

Chciałbym móc zrobić kilka wierszy pogrubionych. Jednak moje próby zmiany czcionki (ręcznie w IB, poprzez kod w viewForTableColumn: ... lub poprzez powiązanie czcionek Bold) zostały dotychczas zignorowane.

Od this message, wydaje się, że to dlatego, że lista styl źródłowy NSOutlineView przejmuje zarządzanie wygląd pola tekstowego za:

Zgaduję, że masz podłączony swoje pole tekstowe do gniazdka textField z NSTableCellView? Jeśli tak, myślę, że możesz uruchomić automatyczne zarządzanie wyglądem NSTableView dla list źródłowych.

Spróbuj odłączyć pole tekstowe od gniazdka textField i sprawdź, czy twoja niestandardowa czcionka się trzyma.

Jeśli odłączę wyjście TextField, wygląd będzie pod moją kontrolą, a moje rozluźnienie działa.

Jednak teraz nie mogę sprawić, żeby wyglądał jak automatyczny. Mam na myśli to, że kiedy NSOutlineView zarządzał wyglądem pola tekstowego, czcionka była pogrubiona i uzyskała cień, gdy wybrano dowolny element, ale kiedy zarządzam nim ręcznie, tak nie jest.

Czy ktoś może odpowiedzieć na jedno z tych pytań:

  1. Jak mogę uzyskać czcionki Bold wiązania do pracy, gdy NSOutlineView zarządza wygląd moim polu tekstowym
  2. Jeśli nie mam NSOutlineView zarządzać pojawienie się mojego pola tekstowego, jak mogę sprawić, by wyglądał i zachowywał się tak, jakbym miał go zarządzać?
+0

Jakiekolwiek wnioski zdobyte od czasu zadawania pytań? Mam podobny problem :( –

+0

Myślę, że zrezygnowałem i użyłem ikony zamiast zmieniać czcionkę.Może to być możliwe, ale nigdy nie dowiedziałem się, jak to zrobić –

Odpowiedz

6

Chyba znalazłem rozwiązanie:

NSTableCellView zarządza wyglądem to textField wylot przez ustawienie właściwości backgroundStyle na komórkach zawartych kontroli. Ustawienie tego na NSBackgroundStyleDark wyzwala specjalną ścieżkę w NSTextFieldCell, która zasadniczo ustawia attributedStringValue, zmieniając kolor tekstu i dodając cień przez NSShadowAttributeName.

Co można zrobić, to dwie rzeczy:

  • Ustaw backgroundStyle na własną rękę w rzędzie lub niestandardowego widoku komórek podklasy.
  • Użyj niestandardowego NSTextFieldCell w polu tekstowym komórki i zmień zachowanie/rysunek.

Zrobiliśmy to drugie, ponieważ potrzebowaliśmy innego wyglądu dla tematycznego (inaczej kolorowego) widoku tabeli. Najwygodniejszym (choć na pewno nie najbardziej wydajne) lokalizacja okazało było to, aby zastąpić - drawInteriorWithFrame:inView: i zmodyfikować komórki przypisać ciąg przed wywołaniem Super, przywracając oryginalny potem:

- (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; 
} 

W nadziei, może to pomóc innym w podobny sytuacje.

+0

Dziękuję za to. – Tommy

0

Nie jestem pewien, czy pominąłem cokolwiek w pytaniu, ale zmieniłem czcionkę za pomocą następujących utworów dla mnie. ReminderTableCellView to tylko podklasa NSTableCellView z dodatkowym datownikiem dodanym.

- (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; 
    } 
} 

Wynikowy widok pokazano poniżej. Zauważ, że jest to opcja NSOutlineView z wybraną opcją Source Listing, ale nie widzę powodu, dla którego to nie działałoby dla normalnego outlineView.

enter image description here

Powiązane problemy