Dynamischer Text mit variabler Länge wird in Tabellenbeschriftungszellenbeschriftungen eingefügt. Damit die Höhen der Tabellenansichtszellen dynamisch dimensioniert werden können, habe ich Folgendes implementiert viewDidLoad()
:
self.tableView.estimatedRowHeight = 88.0
self.tableView.rowHeight = UITableViewAutomaticDimension
Dies funktioniert gut für die Zellen, zu denen noch UITableViewAutomaticDimention
kein Bildlauf durchgeführt werden muss (wie beim Bildlauf zur Zelle aufgerufen wird), jedoch nicht für die Zellen, die beim Laden der Tabelle mit Daten zunächst auf dem Bildschirm gerendert werden.
Ich habe versucht, die Daten einfach neu zu laden (wie in vielen anderen Ressourcen vorgeschlagen):
self.tableView.reloadData()
in beiden viewDidAppear()
und viewWillAppear()
und es war ohne Erfolg. Ich bin verloren. Weiß jemand, wie xcode die dynamische Höhe für die Zellen rendern kann, die ursprünglich auf dem Bildschirm geladen wurden?
Bitte lassen Sie mich wissen, ob es eine bessere alternative Methode gibt.
quelle
Antworten:
Versuche dies:
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension }
BEARBEITEN
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension }
Swift 4
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension }
Swift 4.2
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension }
Definieren Sie oben beide Methoden.
Es löst das Problem.
PS: Damit dies funktioniert, sind obere und untere Einschränkungen erforderlich.
Hier ist ein Beispiel
quelle
Benutze das:
tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 300
und nicht verwenden:
heightForRowAtIndexPath
Funktion delegierenStellen Sie im Storyboard auch nicht die Höhe des Etiketts ein, das eine große Datenmenge enthält. Gib ihm
top, bottom, leading, trailing
Einschränkungen.quelle
heightForRowAtIndexPath
SWIFT 3
tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 160
UND!!! In storyBoard: Sie MÜSSEN TOP & BOTTOM-Einschränkungen für Ihr Label festlegen. Nichts anderes.
quelle
Dieser seltsame Fehler wurde durch Interface Builder-Parameter behoben, da die anderen Antworten das Problem nicht lösten.
Ich habe lediglich die Standardetikettengröße größer gemacht, als der Inhalt möglicherweise sein könnte, und sie auch in der
estimatedRowHeight
Höhe wiedergegeben. Zuvor habe ich die Standardzeilenhöhe in Interface Builder auf festgelegt88px
und in meinem Controller wie folgt wiedergegebenviewDidLoad()
:self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.estimatedRowHeight = 88.0
Aber das hat nicht funktioniert. Also wurde mir klar, dass der Inhalt niemals größer werden würde als vielleicht
100px
, also setzte ich die Standardzellenhöhe auf108px
(größer als der potenzielle Inhalt) und spiegelte sie wie folgt im Controller widerviewDidLoad()
:self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.estimatedRowHeight = 108.0
Dies tatsächlich den Code darf schrumpfen die ersten Etiketten auf die richtige Größe. Mit anderen Worten, es wurde nie größer, konnte aber immer kleiner werden ... Außerdem wurde kein zusätzliches
self.tableView.reloadData()
benötigtviewWillAppear()
.Ich weiß, dass dies keine stark variablen Inhaltsgrößen abdeckt, aber dies funktionierte in meiner Situation, in der der Inhalt eine maximal mögliche Zeichenanzahl hatte.
Ich bin mir nicht sicher, ob dies ein Fehler in Swift oder Interface Builder ist, aber es funktioniert wie ein Zauber. Versuche es!
quelle
Stellen Sie die automatische Abmessung für die Zeilenhöhe und die geschätzte Zeilenhöhe ein und stellen Sie die folgenden Schritte sicher:
@IBOutlet weak var table: UITableView! override func viewDidLoad() { super.viewDidLoad() // Set automatic dimensions for row height // Swift 4.2 onwards table.rowHeight = UITableView.automaticDimension table.estimatedRowHeight = UITableView.automaticDimension // Swift 4.1 and below table.rowHeight = UITableViewAutomaticDimension table.estimatedRowHeight = UITableViewAutomaticDimension } // UITableViewAutomaticDimension calculates height of label contents/text func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { // Swift 4.2 onwards return UITableView.automaticDimension // Swift 4.1 and below return UITableViewAutomaticDimension }
Zum Beispiel: Wenn Sie eine Beschriftung in Ihrer UITableviewCell haben, dann
Hier ist ein Beispieletikett mit dynamischen Höhenbeschränkungen.
quelle
Die dynamische Größenzelle von UITableView erforderte zwei Dinge
Aufrufen dieser Eigenschaften von TableView in viewDidLoad ()
tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 140
Dies ist ein wunderbares Tutorial zur Selbstgröße (dynamische Tabellenansichtszellen), das in Swift 3 geschrieben wurde.
quelle
Für Swift 3 können Sie Folgendes verwenden:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension } func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension }
quelle
Für Swift 4.2
@IBOutlet weak var tableVw: UITableView! override func viewDidLoad() { super.viewDidLoad() // Set self as tableView delegate tableVw.delegate = self tableVw.rowHeight = UITableView.automaticDimension tableVw.estimatedRowHeight = UITableView.automaticDimension } // UITableViewDelegate Method func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension }
Viel Spaß beim Codieren :)
quelle
Versuchen
override func viewWillAppear(animated: Bool) { self.tableView.layoutSubviews() }
Ich hatte das gleiche Problem und es funktioniert bei mir.
quelle
Stellen Sie sicher, dass Sie die folgenden Änderungen vornehmen, damit die automatische Größenänderung von UITableViewCell funktioniert:
In der viewDidLoad-Funktion Ihres UIViewControllers, die unter den UITableView-Eigenschaften festgelegt ist:
self.tableView.estimatedRowHeight = <minimum cell height> self.tableView.rowHeight = UITableViewAutomaticDimension
quelle
<minimum cell height>
fürestimatedRowHeight
) mein Problem wirklich behoben. Zuvor hatte die Zelle eine automatische Größenänderung, aber ich erhielt auch verschiedene Warnungen zu Einschränkungen. Jetzt tue ich nicht! Also, vielen Dank, Anshul !!Für Swift habe ich diese Antwort auch in iOS 9.0 und iOS 11 überprüft (Xcode 9.3).
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension } func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension }
Hier müssen Sie obere, untere, rechte und linke Einschränkungen hinzufügen
quelle
In meinem Fall - Im Storyboard hatte ich zwei Beschriftungen wie im Bild unten. Bei beiden Beschriftungen wurden die gewünschten Breitenwerte festgelegt, bevor ich sie gleich machte. Sobald Sie die Auswahl aufheben, wechselt sie zu automatisch, und wie üblich sollte es wie Charme funktionieren, wenn Sie unten stehen.
1.rowHeight = UITableView.automaticDimension, and 2.estimatedRowHeight = 100(In my case). 3.make sure label number of lines is zero.
quelle
Dies ist einfach, wenn Sie zwei Dinge tun:
tableView.rowHeight = UITableView.automaticDimension
So kann die Layout-Engine die Zellenhöhe berechnen und den Wert korrekt anwenden.
quelle
Ich war nur von Ihrer Lösung inspiriert und habe einen anderen Weg versucht.
Bitte versuchen Sie es hinzufügen
tableView.reloadData()
zuviewDidAppear()
.Das funktioniert bei mir.
Ich denke, die Dinge hinter dem Scrollen sind "die gleichen" wie reloadData. Wenn Sie durch den Bildschirm scrollen, ist es,
reloadData()
als würden Sie anrufen, wannviewDidAppear
.Wenn dies funktioniert, antworten Sie bitte auf diese Antwort, damit ich mir dieser Lösung sicher sein kann.
quelle
Leider bin ich mir nicht sicher, was mir gefehlt hat. Die oben genannten Methoden funktionieren bei mir nicht, um die Höhe der xib-Zelle zu ermitteln, oder lassen Sie layoutifneeded () oder UITableView.automaticDimension die Höhenberechnung durchführen. Ich habe 3 bis 4 Nächte gesucht und versucht, konnte aber keine Antwort finden. Einige Antworten hier oder in einem anderen Beitrag gaben mir jedoch Hinweise für die Problemumgehung. Es ist eine dumme Methode, aber es funktioniert. Fügen Sie einfach alle Ihre Zellen zu einem Array hinzu. Stellen Sie dann den Ausgang jeder Ihrer Höhenbeschränkungen im xib-Storyboard ein. Addieren Sie sie schließlich in der heightForRowAt-Methode. Es ist einfach, wenn Sie mit diesen APIs nicht vertraut sind.
Swift 4.2
CustomCell.Swift
@IBOutlet weak var textViewOneHeight: NSLayoutConstraint! @IBOutlet weak var textViewTwoHeight: NSLayoutConstraint! @IBOutlet weak var textViewThreeHeight: NSLayoutConstraint! @IBOutlet weak var textViewFourHeight: NSLayoutConstraint! @IBOutlet weak var textViewFiveHeight: NSLayoutConstraint!
MyTableViewVC.Swift
. . var myCustomCells:[CustomCell] = [] . . override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = Bundle.main.loadNibNamed("CustomCell", owner: self, options: nil)?.first as! CustomCell . . myCustomCells.append(cell) return cell } override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { let totalHeight = myCustomCells[indexPath.row].textViewOneHeight.constant + myCustomCells[indexPath.row].textViewTwoHeight.constant + myCustomCells[indexPath.row].textViewThreeHeight.constant + myCustomCells[indexPath.row].textViewFourHeight.constant + myCustomCells[indexPath.row].textViewFiveHeight.constant return totalHeight + 40 //some magic number }
quelle
Ich benutze diese
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 100 }
quelle
Zusätzlich zu dem, was andere gesagt haben,
Stellen Sie die Einschränkungen Ihres Etiketts in Bezug auf die Übersicht ein!
Anstatt die Einschränkungen Ihres Etiketts relativ zu anderen Elementen zu platzieren, beschränken Sie es auf die Inhaltsansicht der Zellen der Tabellenansicht.
Stellen Sie dann sicher, dass die Höhe Ihres Etiketts auf mehr als oder gleich 0 und die Anzahl der Zeilen auf 0 eingestellt ist.
Dann
ViewDidLoad
fügen Sie hinzu:tableView.estimatedRowHeight = 695 tableView.rowHeight = UITableViewAutomaticDimension
quelle
Sie sollten einfach alle Einschränkungen für TOP , BOTTOM und HEIGHT für jedes Objekt in der Zellenansicht / den Zellenansichten festlegen und die vorhandene mittlere Y- Position entfernen, falls vorhanden. Denn wo Sie dies nicht getan haben, werden Artefakte in andere Ansichten eingefügt.
quelle
Für Ziel c ist dies eine meiner schönen Lösungen. es hat bei mir funktioniert.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { cell.textLabel.text = [_nameArray objectAtIndex:indexPath.row]; cell.textLabel.numberOfLines = 0; cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewAutomaticDimension; }
Wir müssen diese 2 Änderungen anwenden.
1)cell.textLabel.numberOfLines = 0; cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping; 2)return UITableViewAutomaticDimension;
quelle
Ich hatte dieses Problem anfangs auch, ich hatte mein Problem durch diesen Code behoben und versucht, die Verwendung von
self.tableView.reloadData()
anstelle dieses Codes für die dynamische Höhe zu vermeiden[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
quelle
Bei Verwendung einer Statik
UITableView
setze ich alle Werte imUILabel
s und rufe dann auftableView.reloadData()
.quelle
self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.estimatedRowHeight = 88.0
Und vergessen Sie nicht, Botton-Einschränkungen für das Etikett hinzuzufügen
quelle
Swift 5 Viel Spaß
tablev.rowHeight = 100 tablev.estimatedRowHeight = UITableView.automaticDimension func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = self.tablev.dequeueReusableCell(withIdentifier: "ConferenceRoomsCell") as! ConferenceRoomsCell cell.lblRoomName.numberOfLines = 0 cell.lblRoomName.lineBreakMode = .byWordWrapping cell.lblRoomName.text = arrNameOfRooms[indexPath.row] cell.lblRoomName.sizeToFit() return cell }
quelle
self.Itemtableview.estimatedRowHeight = 0; self.Itemtableview.estimatedSectionHeaderHeight = 0; self.Itemtableview.estimatedSectionFooterHeight = 0; [ self.Itemtableview reloadData]; self.Itemtableview.frame = CGRectMake( self.Itemtableview.frame.origin.x, self.Itemtableview.frame.origin.y, self.Itemtableview.frame.size.width,self.Itemtableview.contentSize.height + self.Itemtableview.contentInset.bottom + self.Itemtableview.contentInset.top);
quelle
Legen Sie die richtige Einschränkung fest und aktualisieren Sie die Delegatenmethoden wie folgt:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension } func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension }
Dadurch wird das Problem der dynamischen Zellenhöhe behoben. WENN nicht, müssen Sie die Einschränkungen überprüfen.
quelle