2010-06-18 19 views
55

Ich habe das klassische gruppierte UITableView mit editierbaren UITextViews in jeder Zelle. Diese Textansichten können ein- oder mehrzeilig sein, und ich möchte, dass die Zelle ihre Höhe erhöht, wenn der Benutzer schreibt und der Text eine neue Zeile beginnt.Wie ändere ich die Größe von UITableViewCell dynamisch?

Meine Frage ist: Muss ich die ganze Tabelle neu laden, nur um die Höhe einer Zelle zu erhöhen? Gibt es keine andere Methode?

Ich habe viel gesucht, und vorherige Antworten und Tutorials nur darüber reden, wie Texthöhe zu berechnen, wie heightForRowAtIndexPath zu implementieren ... Dinge, die ich bereits kenne. Meine Sorge ist, dass ich, um zu erreichen, was ich will, die Höhe berechnen und den Tisch jedes Mal neu laden muss, wenn der Benutzer einen neuen Charakter eingibt, was ich nicht sehr sauber oder effizient finde.

Danke.

Antwort

60

Sie müssen nicht immer die gesamte Tabelle neu laden. Sie können stattdessen nur diese eine Zeile neu laden.

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade]; 
+0

folgte Danke! Aber ich habe jetzt ein anderes Problem: Ich möchte nur diese Zeile neu laden, um ihre Größe zu erhöhen, ich möchte nicht, dass der Zellinhalt erneut instanziert wird. Das Herausnehmen vonWeusableCellWithIdentifier: @ "customid" startet jedoch erst nach dem zweiten Aufruf erneut. Was könnte ich tun? – araid

+0

@rickharrison tatsächlich können Sie, überprüfen Sie meine Antwort unten. –

+0

Es macht den Job wirklich nett, aber der Inhalt der Zelle wächst entsprechend. Wie kann ich das vermeiden? – Gal

26

Um genauer zu sein, ja, Sie haben tableView:heightForRowAtIndexPath: zu implementieren, um die neue Höhe zu berechnen, dann tun, wie rickharrison sagt und [tableView reloadRowsAtIndexPaths:withRowAnimation] nennen. Sagen wir, Ihre Zellen können eine erweiterte Höhe und eine normale Höhe haben, und Sie möchten, dass sie wachsen, wenn Sie darauf tippen. Sie tun können:

-(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]; 
} 
79
[tableView beginUpdates]; 
[tableView endUpdates]; 
+13

Probieren Sie es aus, dieser Code zwingt UITableView, nur Zellengrößen, aber keine Zelleninhalte neu zu laden. –

+0

Während das funktioniert, erzeugt es nicht so reibungslos eine Animation, wenn Sie die Zelle als Neuladen der Zelle mit einem automatischen Zeilenübergang vergrößern. –

+1

Großartig. Verwenden Sie es zusammen mit ReloadRowsAtIndexPaths, wenn Sie eine Animation in einigen Ihrer Zeilen möchten. –

5

-reloadRowsAtIndexPaths:withRowAnimation hat die UITableViewCell Höhe nicht die Größe, auch nachdem ich die Zelle des Rahmens verändert. Es funktionierte nur, wenn ich es mit einem -reloadData:

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade]; 
[tableView reloadData]; 
+0

Vielleicht haben Sie den falschen IndexPfad referenziert, wenn Sie die Anwendung debuggen, die Sie deutlich sehen, nachdem Sie tableView reloadRowsAtIndexPath aufgerufen haben: die Methode tableView: heightForRowAtIndexPath wird tatsächlich aufgerufen. –

Verwandte Themen