Die dynamischen Zellenhöhen von UITableView werden erst nach einigem Scrollen korrigiert

117

Ich habe eine UITableViewmit einem benutzerdefinierten UITableViewCellin einem Storyboard mit automatischem Layout definiert. Die Zelle hat mehrere mehrzeilige UILabels.

Das UITableViewscheint die Zellenhöhen richtig zu berechnen, aber für die ersten Zellen ist diese Höhe nicht richtig zwischen den Beschriftungen aufgeteilt. Nach einigem Scrollen funktioniert alles wie erwartet (auch die Zellen, die anfangs falsch waren).

- (void)viewDidLoad {
    [super viewDidLoad]
    // ...
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    TableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"TestCell"];
    // ...
    // Set label.text for variable length string.
    return cell;
}

Gibt es etwas, das mir möglicherweise fehlt und das dazu führt, dass das automatische Layout seine Arbeit die ersten Male nicht ausführen kann?

Ich habe ein Beispielprojekt erstellt, das dieses Verhalten demonstriert.

Beispielprojekt: Draufsicht auf das Tabellenprojekt aus dem Beispielprojekt beim ersten Laden. Beispielprojekt: Gleiche Zellen nach dem Scrollen nach unten und nach oben.

blackp
quelle
1
Ich bin auch mit diesem Problem konfrontiert, aber die folgende Antwort funktioniert nicht für mich. Jede Hilfe dazu
Shangari C
1
Das gleiche Problem beim Hinzufügen von layoutIfNeeded für Zellen funktioniert bei mir nicht so gut? Weitere Vorschläge
Max
1
Toller Ort. Dies ist immer noch ein Problem im Jahr 2019: /
Fattie
Ich habe im folgenden Link gefunden, was mir geholfen hat - es ist eine ziemlich umfassende Diskussion über Tabellenzellen mit variabler Höhe: stackoverflow.com/a/18746930/826946
Andy Weinstein

Antworten:

139

Ich weiß nicht, ob dies klar dokumentiert ist oder nicht, aber das Hinzufügen [cell layoutIfNeeded]vor der Rückgabe der Zelle löst Ihr Problem.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    TableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"TestCell"];
    NSUInteger n1 = firstLabelWordCount[indexPath.row];
    NSUInteger n2 = secondLabelWordCount[indexPath.row];
    [cell setNumberOfWordsForFirstLabel:n1 secondLabel:n2];

    [cell layoutIfNeeded]; // <- added

    return cell;
}
Rintaro
quelle
3
Ich frage mich allerdings, warum es nur beim ersten Durchgang notwendig ist? Es funktioniert genauso gut, wenn ich den Anruf -layoutIfNeededin der Zelle tätige -awakeFromNib. Ich würde lieber nur dort anrufen, layoutIfNeededwo ich weiß, warum es notwendig ist.
Blackp
2
Hat für mich gearbeitet! Und ich würde gerne wissen, warum es erforderlich ist!
Mustafa
Hat nicht funktioniert, wenn Sie Größenklasse rendern, die sich von jedem X unterscheidet
Andrei Konstantinov
@AndreyKonstantinov Ja, es funktioniert nicht mit der Größenklasse. Wie kann ich dafür sorgen, dass es mit der Größenklasse funktioniert?
z22
Es funktioniert ohne Größenklasse, irgendeine Lösung mit Größenklasse?
Yuvrajsinh
38

Dies funktionierte für mich, wenn andere ähnliche Lösungen nicht funktionierten:

override func didMoveToSuperview() {
    super.didMoveToSuperview()
    layoutIfNeeded()
}

Dies scheint ein tatsächlicher Fehler zu sein, da ich mit AutoLayout und der Verwendung von UITableViewAutomaticDimension sehr vertraut bin, aber gelegentlich immer noch auf dieses Problem stoße. Ich bin froh, dass ich endlich etwas gefunden habe, das als Problemumgehung funktioniert.

Michael Peterson
quelle
1
Besser als die akzeptierte Antwort, da sie nur aufgerufen wird, wenn die Zelle von der xib geladen wird, anstatt von jeder Zellenanzeige. Weit weniger Codezeilen auch.
Robert Wagstaff
3
Vergessen Sie nicht anzurufensuper.didMoveToSuperview()
cicerocamargo
@cicerocamargo Apple sagt über didMoveToSuperview: "Die Standardimplementierung dieser Methode bewirkt nichts."
Ivan Smetanin
4
@IvanSmetanin Es spielt keine Rolle, ob die Standardimplementierung nichts bewirkt. Sie sollten trotzdem die Supermethode aufrufen, da sie in Zukunft tatsächlich etwas bewirken könnte.
TNguyen
(Übrigens sollten Sie auf jeden Fall super anrufen. Ich habe noch nie ein Projekt gesehen, bei dem das Team insgesamt nicht mehr als einmal Zellen unterordnet, also müssen Sie natürlich sicher sein, dass Sie alle abholen. UND als separate Ausgabe genau das, was TNguyen gesagt hat.)
Fattie
22

Hinzufügen [cell layoutIfNeeded]in cellForRowAtIndexPathfunktioniert nicht für Zellen , die zunächst gescrollt out-of-View sind.

Es wird auch nicht vorangestellt [cell setNeedsLayout].

Sie müssen immer noch bestimmte Zellen aus und wieder in die Ansicht scrollen, damit sie die Größe korrekt ändern.

Dies ist ziemlich frustrierend, da bei den meisten Entwicklern Dynamic Type-, AutoLayout- und Self-Sizing-Zellen ordnungsgemäß funktionieren - mit Ausnahme dieses ärgerlichen Falls. Dieser Fehler betrifft alle meine "größeren" Controller für Tabellenansichten.

Szenario
quelle
Auch für mich. Wenn ich zum ersten Mal scrolle, ist die Zellengröße 44px. Wenn ich scrolle, um die Zelle außer Sicht zu bringen und zurück zu kommen, hat sie die richtige Größe. Haben Sie eine Lösung gefunden?
Max
Danke @ ashy_32bit, das hat es auch für mich gelöst.
ImpurestClub
Es scheint ein einfacher Fehler zu sein, @Scenario, oder? schreckliches Zeug.
Fattie
3
Die Verwendung [cell layoutSubviews]anstelle von layoutIfNeeded kann möglicherweise behoben werden. Siehe stackoverflow.com/a/33515872/1474113
ypresto
14

Ich hatte die gleiche Erfahrung in einem meiner Projekte.

Warum passiert es?

In Storyboard entworfene Zelle mit einer gewissen Breite für ein Gerät. Zum Beispiel 400px. Zum Beispiel hat Ihr Etikett die gleiche Breite. Wenn es vom Storyboard geladen wird, hat es eine Breite von 400px.

Hier ist ein Problem:

tableView:heightForRowAtIndexPath: Vor dem Zellenlayout werden die Unteransichten aufgerufen.

Also berechnete es die Höhe für Etikett und Zelle mit einer Breite von 400px. Sie laufen jedoch auf einem Gerät mit Bildschirm, z. B. 320px. Und diese automatisch berechnete Höhe ist falsch. Nur weil Zellen layoutSubviewserst nachher passieren , hilft es nicht, tableView:heightForRowAtIndexPath: auch wenn Sie preferredMaxLayoutWidthIhr Etikett manuell eingestellt haben layoutSubviews.

Meine Lösung:

1) Unterklasse UITableViewund Überschreiben dequeueReusableCellWithIdentifier:forIndexPath:. Stellen Sie die Zellenbreite gleich der Tabellenbreite ein und erzwingen Sie das Layout der Zelle.

- (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [super dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
    CGRect cellFrame = cell.frame;
    cellFrame.size.width = self.frame.size.width;
    cell.frame = cellFrame;
    [cell layoutIfNeeded];
    return cell;
}

2) Unterklasse UITableViewCell. Stellen Sie preferredMaxLayoutWidthmanuell für Ihre Etiketten ein layoutSubviews. Außerdem benötigen Sie ein manuelles Layout contentView, da das Layout nach dem Ändern des Zellenrahmens nicht automatisch erfolgt (ich weiß nicht warum, aber es ist so).

- (void)layoutSubviews {
    [super layoutSubviews];
    [self.contentView layoutIfNeeded];
    self.yourLongTextLabel.preferredMaxLayoutWidth = self.yourLongTextLabel.width;
}
Vitaliy Gozhenko
quelle
1
Als ich auf dieses Problem stieß, musste ich auch sicherstellen, dass der Frame der Tabellenansicht korrekt war. Daher habe ich [self.tableview layoutIfNeeded] aufgerufen, bevor die Tabellenansicht ausgefüllt wurde (in viewDidLoad).
GK100
Ich habe nie aufgehört zu glauben, dass es mit einer falschen Breite zu tun hat. cell.frame.size.width = tableview.frame.widthdann cell.layoutIfNeeded()in der cellForRowAtFunktion den Trick für mich gemacht
Cam Connor
10

Ich habe ein ähnliches Problem, beim ersten Laden wurde die Zeilenhöhe nicht berechnet, aber nach einigem Scrollen oder Wechseln zu einem anderen Bildschirm und ich komme zurück zu diesem Bildschirm Zeilen werden berechnet. Beim ersten Laden werden meine Artikel aus dem Internet geladen und beim zweiten Laden werden meine Artikel zuerst aus Core Data geladen und aus dem Internet neu geladen. Ich habe festgestellt, dass die Zeilenhöhe beim Neuladen aus dem Internet berechnet wird. Daher ist mir aufgefallen, dass beim Aufrufen von tableView.reloadData () während der Segue-Animation (dasselbe Problem mit Push und vorhandenem Segue) die Zeilenhöhe nicht berechnet wurde. Also habe ich die Tabellenansicht bei der Ansichtsinitialisierung ausgeblendet und einen Aktivitätslader eingefügt, um einen hässlichen Effekt für den Benutzer zu verhindern. Nach 300 ms rufe ich tableView.reloadData auf, und jetzt ist das Problem gelöst. Ich denke, es ist ein UIKit-Fehler, aber diese Problemumgehung macht den Trick.

Ich füge diese Zeilen (Swift 3.0) in meinen Handler zum Abschluss des Ladevorgangs ein

DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(300), execute: {
        self.tableView.isHidden = false
        self.loader.stopAnimating()
        self.tableView.reloadData()
    })

Dies erklärt, warum für einige Leute reloadData in layoutSubviews das Problem lösen

Alvinmeimoun
quelle
Dies ist die einzige WA, die auch für mich funktioniert hat. Außer ich verwende nicht isHidden, sondern setze das Alpha der Tabelle beim Hinzufügen der Datenquelle auf 0 und nach dem erneuten Laden auf 1.
PJ_Finnegan
6

Keine der oben genannten Lösungen hat bei mir funktioniert. Was funktioniert hat, ist dieses Rezept einer Magie: Nennen Sie sie in dieser Reihenfolge:

tableView.reloadData()
tableView.layoutIfNeeded() tableView.beginUpdates() tableView.endUpdates()

Meine tableView-Daten werden von einem Webdienst ausgefüllt. Beim Rückruf der Verbindung schreibe ich die obigen Zeilen.

JAHelia
quelle
1
Für Swift 5 funktionierte dies sogar in der Sammlungsansicht, Gott segne dich, Bruder.
Govani Dhruv Vijaykumar
Für mich ergab dies die korrekte Höhe und Anordnung der Zelle, aber es waren keine Daten darin enthalten
Darrow Hartman,
Versuchen Sie setNeedsDisplay () nach diesen Zeilen
JAHelia
5

In meinem Fall wurde die letzte Zeile des UILabels abgeschnitten, als die Zelle zum ersten Mal angezeigt wurde. Es passierte ziemlich zufällig und die einzige Möglichkeit, die richtige Größe zu bestimmen, bestand darin, die Zelle aus der Ansicht zu scrollen und sie zurückzubringen. Ich habe alle möglichen Lösungen ausprobiert, die bisher angezeigt wurden (layoutIfNeeded..reloadData), aber nichts hat bei mir funktioniert. Der Trick bestand darin, "Autoshrink" auf Minimuum Font Scale (0,5 für mich) einzustellen . Versuche es

Claus
quelle
Dies funktionierte für mich, ohne eine der anderen oben aufgeführten Lösungen anzuwenden. Toller Fund.
McKejjm
2
Aber dies schrumpft den Text automatisch ... warum sollte man in einer Tabellenansicht unterschiedliche Textgrößen haben wollen? Sieht schrecklich aus.
Lucius Degeer
5

Fügen Sie eine Einschränkung für den gesamten Inhalt einer benutzerdefinierten Zelle für die Tabellenansicht hinzu, schätzen Sie dann die Zeilenhöhe der Tabellenansicht und setzen Sie die Zeilenhöhe auf die automatische Dimension mit einer Ansicht, die geladen wurde:

    override func viewDidLoad() {
    super.viewDidLoad()

    tableView.estimatedRowHeight = 70
    tableView.rowHeight = UITableViewAutomaticDimension
}

Um dieses anfängliche Ladeproblem zu beheben, wenden Sie die layoutIfNeeded-Methode mit in einer benutzerdefinierten Tabellenansichtszelle an:

class CustomTableViewCell: UITableViewCell {

override func awakeFromNib() {
    super.awakeFromNib()
    self.layoutIfNeeded()
    // Initialization code
}
}
Bikram Sapkota
quelle
Es ist wichtig, estimatedRowHeighteinen Wert> 0 und keinen Wert UITableViewAutomaticDimension(-1) festzulegen, da sonst die automatische Zeilenhöhe nicht funktioniert.
PJ_Finnegan
5

Ich habe die meisten Antworten auf diese Frage ausprobiert und konnte keine davon zum Laufen bringen. Die einzige funktionale Lösung, die ich gefunden habe, bestand darin, meiner UITableViewControllerUnterklasse Folgendes hinzuzufügen :

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    UIView.performWithoutAnimation {
        tableView.beginUpdates()
        tableView.endUpdates()
    }
}

Der UIView.performWithoutAnimationAufruf ist erforderlich, andernfalls wird beim Laden des View Controllers die normale Tabellenansichtsanimation angezeigt.

Chris Vig
quelle
funktioniert und definitiv besser als reloadData zweimal aufzurufen
Jimmy George Thomas
2
Schwarze Magie. Es hat bei viewWillAppearmir nicht funktioniert, aber es hat viewDidAppearfunktioniert.
Martin
Diese Lösung hat bei der Implementierung in viewDidAppear für mich funktioniert. Es ist keineswegs optimal für die Benutzererfahrung, da der Tabelleninhalt bei korrekter Größe herumspringt.
Richard Piazza
Erstaunlich, ich habe viele Beispiele ausprobiert, aber scheitert, du bist ein Dämon
Shakeel Ahmed
Gleich wie @martin
AJ Hernandez
3

Das Anrufen von cell.layoutIfNeeded()Inside cellForRowAtfunktionierte für mich auf iOS 10 und iOS 11, aber nicht auf iOS 9.

Um diese Arbeit auch auf iOS 9 zu bekommen, rufe ich an cell.layoutSubviews()und es hat den Trick gemacht.

Mnemonik23
quelle
2

Screenshot für Ihre ReferenzFür mich funktionierte keiner dieser Ansätze, aber ich stellte fest, dass das Label Preferred Widthin Interface Builder einen expliziten Satz hatte. Das Entfernen (Deaktivieren von "Explicit") und die anschließende Verwendung UITableViewAutomaticDimensionfunktionierten wie erwartet.

Jack James
quelle
2

Ich habe alle Lösungen auf dieser Seite ausprobiert, aber das Deaktivieren der Option "Größenklassen verwenden" und das erneute Überprüfen haben mein Problem behoben.

Bearbeiten: Das Deaktivieren von Größenklassen verursacht viele Probleme im Storyboard, daher habe ich eine andere Lösung ausprobiert. Ich habe meine Tabellenansicht in den View-Controllern viewDidLoadund viewWillAppear-Methoden ausgefüllt. Dies löste mein Problem.

ACengiz
quelle
1

Ich habe das Problem mit der Größenänderung des Etiketts, daher muss ich
nach dem Einrichten des Textes nur chatTextLabel.text = chatMessage.message chatTextLabel? .UpdateConstraints () ausführen

// vollständiger Code

func setContent() {
    chatTextLabel.text = chatMessage.message
    chatTextLabel?.updateConstraints()

    let labelTextWidth = (chatTextLabel?.intrinsicContentSize().width) ?? 0
    let labelTextHeight = chatTextLabel?.intrinsicContentSize().height

    guard labelTextWidth < originWidth && labelTextHeight <= singleLineRowheight else {
      trailingConstraint?.constant = trailingConstant
      return
    }
    trailingConstraint?.constant = trailingConstant + (originWidth - labelTextWidth)

  }
Svitlana
quelle
1

In meinem Fall habe ich in einem anderen Zyklus aktualisiert. Daher wurde die Höhe von tableViewCell aktualisiert, nachdem labelText festgelegt wurde. Ich habe den asynchronen Block gelöscht.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier:Identifier, for: indexPath) 
     // Check your cycle if update cycle is same or not
     // DispatchQueue.main.async {
        cell.label.text = nil
     // }
}
Den Jo
quelle
Ich habe auch einen asynchronen Block, aber er wird benötigt? Gibt es keine Alternative?
Nazar Medeiros
1

Stellen Sie nur sicher, dass Sie den Beschriftungstext nicht in der Delegierungsmethode 'willdisplaycell' der Tabellenansicht festlegen. Legen Sie den Beschriftungstext in der Delegatenmethode 'cellForRowAtindexPath' für die dynamische Höhenberechnung fest.

Bitte :)

Pranav Rivankar
quelle
1

In meinem Fall verursachte eine Stapelansicht in der Zelle das Problem. Es ist anscheinend ein Fehler. Nachdem ich es entfernt hatte, war das Problem gelöst.

Guilherme Carvalho
quelle
1
Ich habe alle anderen Lösungen ausprobiert. Nur Ihre Lösung hat funktioniert. Vielen Dank, dass Sie sie geteilt haben.
tamtoum1987
1

Das Problem ist, dass die anfänglichen Zellen geladen werden, bevor wir eine gültige Zeilenhöhe haben. Die Problemumgehung besteht darin, ein erneutes Laden der Tabelle zu erzwingen, wenn die Ansicht angezeigt wird.

- (void)viewDidAppear:(BOOL)animated
{
  [super viewDidAppear:animated];
  [self.tableView reloadData];
}
alicanozkara
quelle
Dies war weit weit weit weit weitaus bessere Lösung, die mir geholfen hat. Die 100% der Zelle wurden nicht korrigiert, aber bis zu 80% nahmen ihre tatsächliche Größe an. Vielen Dank
TheTravloper
1

Nur für iOS 12+ ab 2019 ...

Ein fortlaufendes Beispiel für Apples gelegentliche bizarre Inkompetenz, bei der Probleme buchstäblich Jahre andauern.

Es scheint so zu sein

        cell.layoutIfNeeded()
        return cell

wird es beheben. (Sie verlieren natürlich etwas an Leistung.)

So ist das Leben mit Apple.

Fattie
quelle
0

In meinem Fall tritt das Problem mit der Zellenhöhe auf, nachdem die anfängliche Tabellenansicht geladen wurde und eine Benutzeraktion stattfindet (Tippen auf eine Schaltfläche in einer Zelle, die die Zellenhöhe ändert). Ich konnte die Zelle nicht dazu bringen, ihre Höhe zu ändern, es sei denn:

[self.tableView reloadData];

Ich habe es versucht

[cell layoutIfNeeded];

aber das hat nicht funktioniert.

Chris Prince
quelle
0

In Swift 3 musste ich jedes Mal self.layoutIfNeeded () aufrufen, wenn ich den Text der wiederverwendbaren Zelle aktualisiere.

import UIKit
import SnapKit

class CommentTableViewCell: UITableViewCell {

    static let reuseIdentifier = "CommentTableViewCell"

    var comment: Comment! {
        didSet {
            textLbl.attributedText = comment.attributedTextToDisplay()
            self.layoutIfNeeded() //This is a fix to make propper automatic dimentions (height).
        }
    }

    internal var textLbl = UILabel()

    override func layoutSubviews() {
        super.layoutSubviews()

        if textLbl.superview == nil {
            textLbl.numberOfLines = 0
            textLbl.lineBreakMode = .byWordWrapping
            self.contentView.addSubview(textLbl)
            textLbl.snp.makeConstraints({ (make) in
                make.left.equalTo(contentView.snp.left).inset(10)
                make.right.equalTo(contentView.snp.right).inset(10)
                make.top.equalTo(contentView.snp.top).inset(10)
                make.bottom.equalTo(contentView.snp.bottom).inset(10)
            })
        }
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let comment = comments[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: CommentTableViewCell.reuseIdentifier, for: indexPath) as! CommentTableViewCell
        cell.selectionStyle = .none
        cell.comment = comment
        return cell
    }

commentsTableView.rowHeight = UITableViewAutomaticDimension
    commentsTableView.estimatedRowHeight = 140
Naloiko Eugene
quelle
0

Keine der oben genannten Lösungen hat funktioniert, aber die folgende Kombination der Vorschläge hat funktioniert.

Musste folgendes in viewDidLoad () hinzufügen.

DispatchQueue.main.async {

        self.tableView.reloadData()

        self.tableView.setNeedsLayout()
        self.tableView.layoutIfNeeded()

        self.tableView.reloadData()

    }

Die obige Kombination aus reloadData, setNeedsLayout und layoutIfNeeded hat funktioniert, aber keine andere. Könnte jedoch spezifisch für die Zellen im Projekt sein. Und ja, musste reloadData zweimal aufrufen, damit es funktioniert.

Stellen Sie außerdem Folgendes in viewDidLoad ein

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = MyEstimatedHeight

In tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath)

cell.setNeedsLayout()
cell.layoutIfNeeded() 
Jimmy George Thomas
quelle
Mein ähnliches reloadData/beginUpdates/endUpdates/reloadDatafunktioniert auch; reloadData muss ein zweites Mal aufgerufen werden. Sie müssen es nicht einwickeln async.
Ray
0

Ich bin auf dieses Problem gestoßen und habe es behoben, indem ich meinen Ansichts- / Etiketteninitialisierungscode von tableView(willDisplay cell:)TO nach verschoben habe tableView(cellForRowAt:).

angehoben und glasiert
quelle
Dies ist NICHT die empfohlene Methode zum Initialisieren einer Zelle. willDisplaywird eine bessere Leistung haben als cellForRowAt. Verwenden Sie nur die letzte, um die richtige Zelle zu instanziieren.
Martin
2 Jahre später lese ich den alten Kommentar, den ich niedergeschrieben habe. Das war ein schlechter Rat. Selbst wenn willDisplaydie Leistung besser ist, wird empfohlen, die Benutzeroberfläche Ihrer Zelle zu initialisieren, cellForRowAtwenn das Layout automatisch ist. In der Tat wird das Layout von UIKit nach cellForRowAt et vor willDisplay berechnet. Wenn Ihre Zellenhöhe von ihrem Inhalt abhängt, initialisieren Sie den Etiketteninhalt (oder was auch immer) in cellForRowAt.
Martin
-1
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{


//  call the method dynamiclabelHeightForText
}

Verwenden Sie die obige Methode, die die Höhe für die Zeile dynamisch zurückgibt. Weisen Sie dem verwendeten Etikett dieselbe dynamische Höhe zu.

-(int)dynamiclabelHeightForText:(NSString *)text :(int)width :(UIFont *)font
{

    CGSize maximumLabelSize = CGSizeMake(width,2500);

    CGSize expectedLabelSize = [text sizeWithFont:font
                                constrainedToSize:maximumLabelSize
                                    lineBreakMode:NSLineBreakByWordWrapping];


    return expectedLabelSize.height;


}

Mit diesem Code können Sie die dynamische Höhe für die Anzeige von Text auf dem Etikett ermitteln.

Ramesh Muthe
quelle
Eigentlich sollte Ramesh dies nicht benötigt werden, solange die Eigenschaften tableView.estimatedRowHeight und tableView.rowHeight = UITableViewAutomaticDimension festgelegt sind. Stellen Sie außerdem sicher, dass für die benutzerdefinierte Zelle die verschiedenen Widgets und die Inhaltsansicht entsprechend eingeschränkt sind.
BonanzaDriver