Hallo, es gibt viele Fragen, die die dynamische Höhe UITableViewCell
von beantworten UITableView
. Allerdings finde ich es komisch, als ich es getan habe.
Hier sind einige der Antworten:
Normalerweise würde dies die dynamische Höhe für die Zelle beantworten
tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension
aber in meinem Fall frage ich mich, dass diese Linie nichts tun wird.
my UITableView
wird angezeigt, nachdem Sie in der geteilten Ansicht auf die Registerkartenleiste geklickt haben. Ist das hilfreich?
Vielleicht fehlt mir etwas. Könnte mir jemand helfen, ich habe 2 Stunden damit verbracht, dumm zu sein.
Dies sind meine Einschränkungen für den Titel. Der Titel könnte lang sein, das Label jedoch nicht.
und das ist meine Zelle
ios
objective-c
swift
uitableview
row-height
CaffeineShots
quelle
quelle
UITableViewCell
Autolayout-Setup in xib / storyboard noch einmal überprüfen . Sie haben ein Problem dort 100%Antworten:
Damit UITableViewAutomaticDimension funktioniert, müssen Sie alle Einschränkungen für links, rechts, unten und oben in Bezug auf die Zellencontaineransicht festlegen. In Ihrem Fall müssen Sie den fehlenden unteren Bereich zur Überwachung der Einschränkung für die Beschriftung unter dem Titel hinzufügen
quelle
Ich hatte Einschränkungen programmgesteuert hinzugefügt und sie versehentlich direkt zur Zelle hinzugefügt, dh nicht auf dem
contentView
Grundstück. Hinzufügen der Einschränkungen,contentView
um es für mich zu lösen!quelle
contentView
. Ich auch Einschränkungen der versehentlich hinzugefügt ,UITableViewCell
wenn es um den sein sollteUITableViewCell
‚scontentView
Um die automatische Bemaßung für die Zeilenhöhe und die geschätzte Zeilenhöhe festzulegen, müssen Sie die folgenden Schritte ausführen, damit die automatische Bemaßung für das Layout der Zellen- / Zeilenhöhe wirksam wird.
UITableViewAutomaticDimension
zu rowHeight & geschätzteRowHeightheightForRowAt
geben Sie einen Wert zurückUITableViewAutomaticDimension
)- -
Ziel c:
// in ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> @property IBOutlet UITableView * table; @end // in ViewController.m - (void)viewDidLoad { [super viewDidLoad]; self.table.dataSource = self; self.table.delegate = self; self.table.rowHeight = UITableViewAutomaticDimension; self.table.estimatedRowHeight = UITableViewAutomaticDimension; } -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewAutomaticDimension; }
Schnell:
@IBOutlet weak var table: UITableView! override func viewDidLoad() { super.viewDidLoad() // Don't forget to set dataSource and delegate for table table.dataSource = self table.delegate = self // 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 }
Für Label-Instanz in UITableviewCell
Hinweis : Wenn Sie mehr als ein Etikett (UIElements) mit dynamischer Länge haben, das entsprechend seiner Inhaltsgröße angepasst werden sollte: Passen Sie die Priorität "Inhaltsumarmung und Kompressionswiderstand" für Etiketten an, die Sie mit höherer Priorität erweitern / komprimieren möchten.
quelle
Stellen Sie außerdem sicher, dass die Linien für Ihr UILabel in der Zelle auf 0 gesetzt sind. Wenn sie auf 1 gesetzt sind, wächst sie nicht vertikal.
quelle
Ich habe einen bestimmten Fall und 99% der von mir gelesenen Lösungen haben nicht funktioniert. Ich dachte, ich würde meine Erfahrungen teilen. Ich hoffe, es kann helfen, da ich ein paar Stunden gekämpft hatte, bevor ich dieses Problem behoben hatte.
Mein Szenario :
Was ich erreichen musste :
Was Sie überprüfen müssen, damit es reibungslos funktioniert :
Wie in jedem Tutorial und jeder Antwort angegeben, legen Sie alle Einschränkungen für Ihr Label / Ihren Inhalt (oben, unten, führend und nachfolgend) fest und setzen Sie sie auf ContentView (Superview). Dieses Video-Tutorial wird hilfreich sein .
In der
viewWillAppear
Methode meines ViewControllers gebe ich einer meiner tableViews (tableView2
) eine geschätzte Zeilenhöhe und verwende dann dieUITableViewAutomaticDimension
als solche (und wie in allen Tutorials / Antworten zu sehen):override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) tableView2.estimatedRowHeight = 80 tableView2.rowHeight = UITableViewAutomaticDimension }
Für mich waren diese vorherigen Schritte nicht genug. Meine TableView würde einfach die geschätzte Zeilenhöhe nehmen und sie mit der Anzahl der Zellen multiplizieren. Meeeh.
Als ich zwei verschiedene Tableviews verwendet werde, habe ich einen Ausgang für jeden von ihnen,
tableView1
undtableView2
. Erlaubt mir, die Größe in derviewDidLayoutSubviews
Methode zu ändern . Fühlen Sie sich frei, im Kommentar zu fragen, wie ich das gemacht habe.Ein zusätzlicher Schritt hat es für mich behoben, indem er dies zur
viewDidAppear
Methode hinzufügte :override func viewDidAppear(_ animated: Bool) { tableView1.reloadData() // reloading data for the first tableView serves another purpose, not exactly related to this question. tableView2.setNeedsLayout() tableView2.layoutIfNeeded() tableView2.reloadData() }
Hoffe das hilft jemandem!
quelle
Ab iOS 11 und Xcode 9.3 sind die meisten der oben genannten Informationen falsch. Im Apple-Handbuch wird die Einstellung vorgeschlagen
tableView.estimatedRowHeight = 85.0 tableView.rowHeight = UITableViewAutomaticDimension
Die WWDC 2017-Sitzung 245 (Erstellen von Apps mit dynamischem Typ, ca. 16:33 im Video) schlägt etwas Ähnliches vor. Nichts davon machte einen Unterschied für mich.
Für eine Zelle im Untertitelstil müssen Sie lediglich die Anzahl der Zeilen (im Abschnitt Beschriftung des Attributinspektors) für Titel und Untertitel auf 0 setzen, um Zellen mit Tabellengröße in der Größe zu erhalten. Wenn eine dieser Beschriftungen zu lang ist und Sie die Anzahl der Zeilen nicht auf 0 setzen, passt die Größe der Tabellenansichtszelle nicht an.
quelle
numberOfLines
zu0
für beide Etiketten können Sie selbst Sizing erhalten mit nicht angepasstenUITableViewCell
s. Danke vielmals!Vergessen zu entfernen
tableView(heightForRowAt:indexPath:)
Es kann sein, dass Sie wie ich versehentlich vergessen haben, den Boilerplate-Code für die
heightForRowAt
Methode zu entfernen .func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 60.0 }
quelle
UITableViewAutomaticDimension
in dieser Methode zurückkehren. Für UnterklassenFür alle, die vielleicht das gleiche Problem mit mir hatten: Ich hatte eine Stunde lang Mühe, es zum Laufen zu bringen. Ein einfaches UIlabel mit Einschränkungen für oben, unten links und rechts. Ich habe die willDisplayCell verwendet, um die Daten an die Zelle zu übergeben, und dies verursachte Probleme bei der Zellenhöhe. Solange ich diesen Code in cellForRow eingefügt habe, hat alles einwandfrei funktioniert. Ich habe nicht verstanden, warum dies passiert ist. Vielleicht wurde die Zellenhöhe vor dem Aufruf von willDisplayCell berechnet, sodass kein Inhalt für die richtige Berechnung vorhanden war. Ich wollte nur erwähnen und wahrscheinlich jemandem mit dem gleichen Problem helfen.
quelle
In iOS 11 und höher funktionierte es einwandfrei, während in iOS 10 die Lösung darin bestand, etwas hinzuzufügen
table.rowHeight = UITableView.automaticDimension table.estimatedRowHeight = 200 // a number and not UITableView.automaticDimension
Stellen Sie außerdem sicher, dass Sie "heightForRowAt" hinzufügen, auch wenn es in iOS 11 und höher funktioniert. Dies ist erforderlich, wenn Sie iOS 10 unterstützen
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension }
quelle
In meinem Fall hatte ich zwei UITableViews, ich musste diese Methode als ändern
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ CGFloat height = 0.0; if (tableView == self.tableviewComments) { return UITableViewAutomaticDimension; }else if (tableView == self.tableViewFriends) { height = 44.0; } return height; }
quelle
Versuchen Sie dies, einfache Lösung, es funktioniert für mich,
In viewDidLoad schreiben Sie diesen Code,
-(void)viewDidLoad { [super viewDidLoad]; self.tableView.estimatedRowHeight = 100.0; // for example. Set your average height self.tableView.rowHeight = UITableViewAutomaticDimension; }
Schreiben Sie in cellForRowAtIndexPath diesen Code:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ; } cell.textLabel.numberOfLines = 0; // Set label number of line to 0 cell.textLabel.text=[[self.arForTable objectAtIndex:indexPath.row] valueForKey:@"menu"]; [cell.textLabel sizeToFit]; //set size to fit return cell; }
quelle
Für mein Setup habe ich zuerst die Einschränkungen im Storyboard überprüft, um festzustellen,
UITableViewCell
ob sie von oben nach unten eindeutig sind, und musste dann den Code an zwei Stellen ändern.UITableViewDelegate
'stableView(_:heightForRowAt:)
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension // return UITableViewAutomaticDimension for older than Swift 4.2 }
UITableViewDelegate
'stableView(_:estimatedHeightForRowAt:)
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension // return UITableViewAutomaticDimension for older than Swift 4.2 }
In Schritt 1 und 2 können Sie die automatische Größenanpassung nur für bestimmte Zeilen anwenden.
UITableView
Verwenden Sie für die Bewerbung für das Ganze :tableView.rowHeight = UITableView.automaticDimension tableView.estimatedRowHeight = UITableView.automaticDimension // return UITableViewAutomaticDimension for older than Swift 4.2
quelle
Damit UITableViewAutomaticDimension funktioniert, müssen Sie sicherstellen, dass alle Einschränkungen der 4 Ecken zur Übersicht hinzugefügt werden. In den meisten Fällen funktioniert es gut mit UILabel, aber manchmal finde ich, dass UITextView den Trick macht, wenn UILabel zu diesem Zeitpunkt nicht gut funktioniert. Versuchen Sie also, zu UITextView zu wechseln, und stellen Sie sicher, dass
Scrolling Enabled
das Kontrollkästchen im Storyboard deaktiviert ist. Sie können es auch programmgesteuert festlegen.quelle
Ich hatte drei horizontale Gegenstände und der am weitesten links liegende hatte eine Beschränkung auf den linken, der mittlere auf den oberen, unteren, linken und rechten Gegenstand. Der rechte hatte einen rechten und einen linken zum mittleren Gegenstand. Die Lösung bestand darin, dem mittleren Element (meinem Etikett) zusätzliche linke und rechte Einschränkungen hinzuzufügen, die> = eine Zahl in der Zelle waren.
quelle
Stellen Sie sicher, dass alle Ansichten in der Zelle auf die Inhaltsansicht und nicht auf die Zelle beschränkt sind.
Wie Apfel sagt:
quelle
Ich habe eine neue Lösung ... das hat bei mir funktioniert.
im Grunde
UITableViewAutomaticDimension
umbenannt inUITableView.automaticDimension
... Ich hoffe ... es ist woquelle