2014-12-30 14 views
7

Mam dynamiczny niestandardowy UITableViewCell, który korzysta z automatycznego układu.Preferowane podejście do zmiany treści UITableViewCell na podstawie szerokości komórki

Zmieniam zawartość tekstu etykiety, w zależności od szerokości komórki.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ... 
    cell.someLabel.text = CGRectGetWidth(cell.bounds) < 321 ? @"Concise" : @"Much longer blurb"; 

    return cell; 
} 

reloadData jest wywoływana podczas zmiany orientacji, aby zaktualizować etykietę.

Podczas gdy to się dzieje, wyobrażam sobie, że istnieje lepszy sposób na poradzenie sobie z tym, co nie wiąże się z koniecznością ponownego załadowania tableView.

(Żaden z ograniczeniami muszą zostać zmienione. Etykieta jest w tym samym miejscu, ale po prostu pokazuje inną treść, gdy nie ma już miejsca dla niego.)

  • Mam podklasa UILabel i zmienić tekst w -didMoveToSuperview?

  • Czy można zmienić tekst w -layoutSubViews? (Czy nie spowodowałoby to przejścia przez inny układ, ponieważ tekst został zmieniony?)

Dzięki za wszelkie odpowiedzi!

+0

"nie wiąże się z przeładowaniem tableView" Myślę, że pierwszą rzeczą do zrobienia jest ponowne przemyślenie, dlaczego uważasz, że ponowne załadowanie widoku tabeli jest "napowietrzne". Jest dość wydajny, ponieważ tylko widoczne dane komórki tabeli są faktycznie pobierane - a twój model danych powinien być całkowicie sprawny lub robisz to źle. – matt

+0

To po prostu wydaje się przesadą, Matt. Auto-layout już się dzieje, w wyniku automatycznego obrotu i domyślam się, że można go obsłużyć w ramach już istniejącego przejścia do layoutu. Po prostu nie wiem wystarczająco dużo o automatycznym layoucie, aby wiedzieć, jak powinna to zrobić komórka lub etykieta. –

+0

Ale nie wspomnę o subtelnym migotaniu reloadu, którego nie zobaczyłbyś bez przeładowania. Byłoby ładniej, gdybym nie musiał przeładowywać stołu, a on po prostu automatycznie się obracał i reduował (z inną zawartością). Możliwy? –

Odpowiedz

4

Po prostu dodanie tej logiki do layoutSubviews powinno załatwić sprawę. Jest wywoływana za każdym razem, gdy silnik układu automatycznego wykonuje swoje zadanie.

-(void)layoutSubviews { 
    self.someLabel.text = CGRectGetWidth(self.bounds) < 321 ? @"Concise" : @"Much longer blurb"; 
    [super layoutSubviews]; 
} 
+0

Używam '-viewWillTransitionToSize: withTransitionCoordinator:' Chciałbym spróbować obsłużyć to wszystko w ramach automatycznego układu (ponieważ widoczne komórki reagują na przejście bez konieczności ponownego ładowania tabeli). Muszę tylko dowiedzieć się, gdzie właściwie zmienić tekst. –

+0

Jeśli komórki wzrokowe już reagują, dlaczego nie umieścić zmiany tekstu w miejscu, w którym ma miejsce reakcja? – Rick

+0

To jest moje myślenie, ale nie wiem, którą metodę zastosować, i nigdy nie majstrowałem przy "-layoutSubviews", jeśli jest to nawet właściwa metoda do przesłonięcia. Zanurzycie się w nieznane za kilka dni i spróbujecie odkryć, gdzie powinna nastąpić zmiana tekstu, jeśli nikt nie ma takiej odpowiedzi. –

Powiązane problemy