Jak dynamicznie zmieniać rozmiar uitableviewcell height

Mam klasyczny pogrupowany UITableView z edytowalnymi Uitextviewami wewnątrz każdej komórki. Te widoki tekstu mogą być pojedyncze lub Wielowierszowe i chcę, aby komórka zwiększała swoją wysokość, gdy użytkownik pisze, a tekst rozpoczyna nową linię.

Moje pytanie brzmi: Czy muszę przeładować całą tabelę tylko po to, aby zwiększyć wysokość komórki? Nie ma innej metody?

Szukałem dużo, a poprzednie odpowiedzi i tutoriale mówią tylko o tym, jak obliczyć wysokość tekstu, jak wdrożyć heightForRowAtIndexPath... rzeczy, które już wiem. Moim zmartwieniem jest to, że, aby osiągnąć to, co chcę, będę musiał obliczyć wysokość i przeładować tabelę za każdym razem, gdy użytkownik wejdzie nowy znak, który nie uważam za bardzo czysty i skuteczny.

Dzięki.
Author: araid, 2010-06-18

4 answers

Nie zawsze trzeba przeładowywać całą tabelę. Zamiast tego możesz po prostu przeładować ten jeden wiersz.

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
 60
Author: rickharrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-18 13:57:35
[tableView beginUpdates];
[tableView endUpdates];
 81
Author: Andrey Z.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-14 15:18:20

Aby być bardziej szczegółowym, tak, musisz zaimplementować tableView:heightForRowAtIndexPath:, Aby obliczyć nową wysokość, a następnie wykonać jak mówi rickharrison i zadzwonić [tableView reloadRowsAtIndexPaths:withRowAnimation]. Powiedzmy, że twoje komórki mogą mieć rozszerzoną wysokość i normalną wysokość, i chcesz, aby rosły po naciśnięciu. Można zrobić:

-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*) indexPath 
{
    if ([expandedPaths containsObject:indexPath]) {
        return 80;
    } else {
        return 44;
    }
 }

-(void)tableView:(UITableView*) didSelectRowAtIndexPath:(NSIndexPath*) indexPath
{
    [expandedPaths addObject:indexPath];
    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
 26
Author: Elfred,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-22 03:47:52

-reloadRowsAtIndexPaths:withRowAnimation nie zmieniłem rozmiaru UITableViewCell wysokości, nawet po zmianie ramki komórki. Zadziałało tylko wtedy, gdy podążałem za nim -reloadData:

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
[tableView reloadData];
 5
Author: windson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-03 20:43:28