Ich habe eine Prototyp-Zelle in meinem UITableView
, die ein UILabel
enthält. Ich möchte die Größe des Labels (und der Zelle) abhängig von der Größe des Textes im Label dynamisch ändern.
Ich erstelle die Prototyp-Zelle in cellForRowAtIndexPath
wie folgt:
Dann hat meine ProgramDetailCell
die folgende Implementierung:
Beim ersten Anzeigen der Zelle wird layoutSubviews
aufgerufen, aber descriptionLabel
wird nicht skaliert. Wenn ich jedoch in der Tabelle nach unten blättere und wieder nach oben blättere, erscheint die "wiederverwendet" -Zelle mit der richtigen Größe der Beschriftung!
Warum funktioniert es nicht beim ersten Mal, wenn die Zelle angezeigt wird - und was muss ich tun, um es zu reparieren?
Vielen Dank im Voraus!
Es funktioniert nicht, weil Sie auto layout
verwenden. Sie benötigen etwas auto layout
Weg, um dies zu erreichen.
Hier ist die Lösung.
Schritt 1:
Lassen Sie% UILabel
an den oberen und unteren Rand von UITableViewCell
angeheftet werden. Sie können dies durch Interface Builder
erreichen, indem Sie Vertical Constraint
für UILabel
von top
und bottom
für die Zelle verwenden. Das erhöht die Höhe von UILabel
, wenn die Höhe der Zelle zunimmt oder umgekehrt.
Schritt 2:
Berechnen Sie in Ihrer UIViewController in - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
Methode die Größe von UITableViewCell
.
Sie können es berechnen mit:
%Vor% gibt jetzt das textFrame.size.height
+ Padding zurück, falls vorhanden.
Schritt 3:
Sie werden erreichen, was Sie wollten --- "Ändern Sie dynamisch die Größe des Etiketts (und der Zelle) abhängig von der Größe des Textes in der Etikette" nach dem Kompilieren und selbst zum ersten Mal ausgeführt wird.
Nach dem Abrufen aller Daten vom Server können Sie mit dieser Methode die Höhe dieses UILabel
ermitteln.
Und hier habe ich eine Beschreibung von measureHeightForText:
gegeben. Diese Logik funktioniert in allen iOS5
, iOS6
, iOS7
.
Und dann aktualisieren Größe Ihres Etiketts entsprechend. Das funktioniert gut für mich. Ich benutze es.
Denn wenn layoutSubviews
aufgerufen wird, ist Ihr descriptionLabel
Text noch nicht gesetzt. Und wenn Sie scrollen, wird der Text festgelegt. So ist es jetzt richtig.
Ich schlage vor, dass Sie sizeToFit
aufrufen, nachdem Sie den Text festgelegt haben.
Rufen Sie dies in heightForRowAtIndexPath
auf und berechnen Sie die Höhe manuell
Wenn Ihre Anforderung die Höhe der Etikettenhöhe dynamisch ändert, folgen Sie dem Link unten. Wenn wir die Höhe des Etiketts ändern müssen, müssen wir auch die Zeilenhöhe ändern:
Verwenden Sie den folgenden Code für die dynamische Höhe in Zelle
festgelegt %Vor%Wenn Sie das automatische Layout verwenden, hat die Änderung des Rahmens keine Auswirkungen.
Stattdessen sollten Sie die Einschränkungen ändern.
Tags und Links objective-c uitableview ios autolayout layoutsubviews