2013-01-22 12 views
8

Mam pewne problemy zaimplementowane dynamiczne wysokości rzędów w UITableView - ale to nie komórki, z którymi mam problem, to UILabel wewnątrz komórki.UILabel w UITableViewCell o dynamicznej wysokości

W komórce znajduje się tylko UILabel do wyświetlenia tekstu. Moja tableView: heightForRowAtIndexPath: poprawnie zmienia rozmiar każdej komórki poprzez obliczenie wysokości etykiety, która będzie w nim za pomocą metody sizeWithFont: NSString.

Posiadam podklasę obiektu UITableViewCell, który zawiera właściwość UILabel, która jest podłączona do storyboardu. W scenorysie ustawiłem linie na 0, więc użyje ona tyle linii, ile potrzebuje, i ustawiłem jej linię na Zawijanie słów.

Oto jak ja utworzenie komórek:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ExpandCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    SomeObject *object = self.tableObjects[index.row]; 

    cell.myLabel.text = [object cellText]; 

    [cell.myLabel sizeToFit]; 

    return cell; 
} 

Kiedy budować to, mam moim stole widok z komórką wszystko o wymiarach do odpowiedniej wysokości za ich treść, ale etykiety są wszyscy 1 linia, która biegnie z boku komórek. Jeśli jednak przewinę tabelę, aby komórki opuściły ekran, a następnie przewijają do nich, ich etykieta zostanie odpowiednio zmieniona, a komórka będzie wyglądać, jak początkowo oczekiwałam.

Próbowałem także obliczyć ramkę z etykietami za pomocą tej samej metody, z której obliczam wysokość wiersza, i otrzymuję to samo zachowanie - nie rysuje poprawnie, dopóki nie przewinie ekranu i nie włączy się ponownie.

Znalazłem dwa sposoby obejścia tego problemu i żadne z nich nie są akceptowalne.

Po pierwsze, jeśli w viewDidAppear: Wywołuję reloadData w moim widoku tabeli, komórki i etykiety losują się poprawnie za pierwszym razem. To nie zadziała w mojej sytuacji, ponieważ będę dodawał i usuwał komórki do tej tabeli i nie chcę wywoływać polecenia reloadData za każdym razem, gdy dodawana jest komórka.

Drugie rozwiązanie wydaje mi się bardzo dziwne - jeśli zostawiam ustawienia czcionki domyślną czcionką systemową 17 na UILabel, komórki rysują się poprawnie. Gdy tylko zmieniam rozmiar czcionki, powraca ona do zachowania polegającego na tym, że nie rysuje poprawnie etykiety, dopóki nie opuści ekranu i nie wróci, lub zostanie wywołana funkcja reloadData wywoływana w tableView.

Byłbym wdzięczny za pomoc w tej sprawie.

+0

Ten post poprawnie odpowiada na problem: http://stackoverflow.com/questions/8903369/dynamic- uitableviewcell-height. Może to być trochę trudne, jeśli nigdy wcześniej nie tworzyłeś dynamicznie wielkości komórek, ale nie jest to zbyt trudne. – macandyp

+0

Nie rozumiem, jak kod w tej odpowiedzi robi coś innego niż to, co robię. JESTEM ustawianie ramki mojej etykiety w komórceForRowAtIndexPath, ale nie stosuje tej ramki, dopóki nie zostanie ponownie wyrysowany. Czy może czegoś brakuje? – alivingston

+0

Czy wdrażasz heightForRowAtIndexPath? – macandyp

Odpowiedz

8

W końcu rozwiązałem to przez przydział/init'ing etykiety w cellForRowAtIndexPath. Nie jestem do końca pewien, dlaczego to jest rozwiązanie - ale wydaje się, że problem, który miałem do czynienia, dotyczy sposobu, w jaki storyboard (lub kiedy, być może?) Tworzy obiekty w komórce. Jeśli przydzielę/zainicjuję etykietę w komórce w komórceForRowAtIndexPath, wszystko ładuje się poprawnie i rozmiary.

Więc ... moja obecna poprawka polega na sprawdzeniu, czy komórka ma w sobie moją niestandardową etykietę. Jeśli tak nie jest, przydzielam/edytuję etykietę i umieszczam ją w komórce. Jeśli ma taki, jak w komórce, która została usunięta, to po prostu ustawiam tekst w etykiecie, która już tam jest.

Nie jestem pewien, czy jest to najlepsze rozwiązanie, ale na razie działa.

+0

Napotkałem podobny problem. Rozwiązałem go, usuwając [cell.myLabel sizeToFit] z tableView: cellForRowAtIndexPath :. Następnie użyj storyboardu, dodaj ograniczenia Top Space do Superview, Bottom Space to Superview. – jemeshsu

+0

Uratowałeś mój czas. Dziękuję Ci – NightFury

3

Rozwiązałem to zadanie, odznaczając pole wyboru Automatyczna zmiana rozmiaru w IB. Nie jest jasne, dlaczego auto-layout powodował ten problem.

2

wpadłem na ten sam problem i skończę go rozwiązać poprzez wywołanie [cell layoutIfNeeded] przed powrotem komórce

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
ExpandCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
SomeObject *object = self.tableObjects[index.row]; 

cell.myLabel.text = [object cellText]; 

[cell layoutIfNeeded]; 

return cell; } 
Powiązane problemy