2012-08-22 9 views
9

Widok oparty na widoku NSTableView z wierszami, które mają dynamiczne wysokości, nie zmienia rozmiaru wierszy po zmianie rozmiaru widoku tabeli. Jest to problem, gdy wysokość wiersza jest określana na podstawie szerokości widoku tabeli (myślenie blokami tekstu, które wypełniają kolumnę i owijają ją, zwiększając tym samym rozmiar wiersza).Prawidłowe zmienianie rozmiarów wierszy w widoku NSTableView opartym na widoku

Próbowałem dostać NSTableView do rozmiaru jego wierszy, gdy zmienił rozmiar, ale doświadczyło mały sukces:

  • Gdybym rozmiaru tylko widocznych wierszy poprzez odpytywanie enumerateAvailableRowViewsUsingBlock: niektóre niewidocznych wierszy nie jest zmieniany i dlatego pokazane zostały ze starą wysokością, gdy użytkownik przewija i pokazuje te wiersze.
  • Jeśli zmieniam rozmiar wszystkich wierszy, staje się zauważalnie wolny, gdy jest dużo wierszy (około 1 sekundy opóźnienia po każdorazowym dopasowaniu okna do 1000 wierszy w moim 1,8 GHz i7 MacBook Air).

Ktoś może pomóc?

To gdzie ja wykryć zmiany rozmiaru widoku tabeli - w widoku tabeli za delegata:

- (void)tableViewColumnDidResize:(NSNotification *)aNotification 
{ 
    NSTableView* aTableView = aNotification.object; 
    if (aTableView == self.messagesView) { 
     // coalesce all column resize notifications into one -- calls messagesViewDidResize: below 

     NSNotification* repostNotification = [NSNotification notificationWithName:BSMessageViewDidResizeNotification object:self]; 
     [[NSNotificationQueue defaultQueue] enqueueNotification:repostNotification postingStyle:NSPostWhenIdle]; 
    } 
} 

Podczas gdy Poniżej znajduje się obsługi zgłoszenia zamieszczonych powyżej, gdzie widoczne rzędy get przeskalowane:

-(void)messagesViewDidResize:(NSNotification *)notification 
{ 
    NSTableView* messagesView = self.messagesView; 

    NSMutableIndexSet* visibleIndexes = [NSMutableIndexSet new]; 
    [messagesView enumerateAvailableRowViewsUsingBlock:^(NSTableRowView *rowView, NSInteger row) { 
     if (row >= 0) { 
      [visibleIndexes addIndex:row]; 
     } 
    }]; 
    [messagesView noteHeightOfRowsWithIndexesChanged:visibleIndexes]; 
} 

alternatywna implementacja że zmienia rozmiar wszystkich wierszy wygląda tak:

-(void)messagesViewDidResize:(NSNotification *)notification 
{ 
    NSTableView* messagesView = self.messagesView;  
    NSIndexSet indexes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0,messagesView.numberOfRows)];  
    [messagesView noteHeightOfRowsWithIndexesChanged:indexes]; 
} 

Uwaga: To pytanie jest w pewnym stopniu powiązane z View-based NSTableView with rows that have dynamic heights, ale jest bardziej ukierunkowane na reagowanie na zmianę rozmiaru widoku tabeli.

Odpowiedz

11

Właśnie przeszedłem ten dokładny problem. Co zrobiłem było monitorować NSViewBoundsDidChangeNotification dla widoku zwoju Treści

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollViewContentBoundsDidChange:) name:NSViewBoundsDidChangeNotification object:self.scrollView.contentView]; 

i obsługi, uzyskać widocznych wierszy i nazywają noteHeightOfRowsWithIndexesChange :. Wyłączyć animację podczas gdy to robi, więc użytkownik nie widzi wiersze poruszać podczas zmiany rozmiaru, jak widok na przyjść do tabeli

- (void)scrollViewContentBoundsDidChange:(NSNotification*)notification 
{ 
    NSRange visibleRows = [self.tableView rowsInRect:self.scrollView.contentView.bounds]; 
    [NSAnimationContext beginGrouping]; 
    [[NSAnimationContext currentContext] setDuration:0]; 
    [self.tableView noteHeightOfRowsWithIndexesChanged:[NSIndexSet indexSetWithIndexesInRange:visibleRows]]; 
    [NSAnimationContext endGrouping]; 
} 

to musi wykonać szybko tak przewija stół ładnie ale jego pracę bardzo dobrze dla mnie.

+0

Dla mnie czekałem aż użytkownik zakończy zmianę rozmiaru, a następnie ponownie dostosuje wysokość rzędów. – adib

+1

najwyraźniej widok przewijania zawartości widoku nie pisać powiadomienia zmian, nawet po wywołaniu '[setPostsBoundsChangedNotifications self.scrollView.contentView: TAK]' – adib

+1

wydaje się, że NSViewFrameDidChangNotification działa lepiej na żywo rozmiaru –

Powiązane problemy