Ich möchte die Inhaltsgröße meiner UITableView
berechnen. Ich benutze Autolayout mit Höhe UITableViewAutomaticDimension
.
Wurde versucht, [UITableView contentsize]
nach dem erneuten Laden der Tabellenansicht abzurufen, wird die Höhe basierend auf estimatedRowHeight
berechnet.
self.tableView.estimatedRowHeight = 50;
self.tableView.rowHeight = UITableViewAutomaticDimension;
Delegierter -
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;
}
Der Versuch, die Inhaltsgröße abzurufen und der Höhenbeschränkung zuzuordnen.
[self.tableView reloadData];
[self.tableView layoutIfNeeded];
self.tableHeightConstraint.constant = self.tableView.contentSize.height;
Irgendwelche Vorschläge? Danke im Voraus.
Bearbeiten:
Endlich habe ich mein Problem mit Tweak gelöst. Ich habe die Höhe der Tabellenansicht in max geändert (in meinem Fall ist 300 maximal), bevor ich die Daten erneut in die Tabelle lade. Daher hat tableview Platz für die Größenänderung aller Zellen.
self.tableHeightConstraint.constant = 300;
[self.tableView reloadData];
[self.tableView layoutIfNeeded];
self.tableHeightConstraint.constant = self.tableView.contentSize.height;
Danke für die Hilfe.
Endlich habe ich mein Problem mit Tweak gelöst. Ich habe die Höhe der Tabellenansicht in max geändert (in meinem Fall ist 300 maximal), bevor ich die Daten erneut in die Tabelle lade. Daher hat tableview Platz für die Größenänderung aller Zellen.
self.tableHeightConstraint.constant = 300;
[self.tableView reloadData];
[self.tableView layoutIfNeeded];
self.tableHeightConstraint.constant = self.tableView.contentSize.height;
Wenn Sie dies veröffentlichen, wird es für andere hilfreich sein.
Zum Schluss habe ich dein Problem verstanden und hier ist die Lösung davon.
Ich hoffe du hast das schon gemacht.
UITableView
.IBOutlet
von UITableView
Height.viewDidLayoutSubviews
-Methode die ursprüngliche UITableView
-Höhe nach dem Füllen der Daten erhalten.Aktualisieren Sie den folgenden Code:
override func viewDidLayoutSubviews() {
constTableViewHeight.constant = tableView.contentSize.height
}
Aktualisieren:
self.tableView.estimatedRowHeight = UITableViewAutomaticDimension;
Bitte prüfen Sie das.
Durch das Setzen des geschätztenZugriffs auf zero während der Initialisierung der Tabellensicht und durch Hinzufügen des folgenden Codes zu viewDidLayoutSubviews hat es für mich funktioniert!
tableView.reloadData()
tableView.layoutIfNeeded()
tableView.constant = tableView.contentSize.height
Alle oben genannten Lösungen funktionierten nicht für meinen Fall ... Ich benutzte einen Beobachter wie diesen:
self.tableView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if let obj = object as? UITableView {
if obj == self.tableView && keyPath == "contentSize" {
if let newSize = change?[NSKeyValueChangeKey.newKey] as? CGSize {
self.tableView.frame.size.height = newSize.height
}
}
}
}
Sie können zwei Dinge ausprobieren,
Aufruf der Methode nach einigen Sekunden Verzögerung, nachdem tableView vollständig neu geladen wurde.
- (void)adjustHeightOfTableview
{
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
//In my case i had to call this method after some delay, because (i think) it will allow tableView to reload completely and then calculate the height required for itself. (This might be a workaround, but it worked for me)
[self performSelector:@selector(adjustHeightOfTableview) withObject:nil afterDelay:0.3];
});
}
Wenn Sie die obige Methode aufrufen, geben Sie EstimatedHeightForRow nicht zurück.
/*
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 44;
}
*/
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewAutomaticDimension;
}
Probieren Sie es einfach aus, es könnte Ihnen helfen, das Problem zu lösen.
Für mich bestand die Lösung darin, einfach die Variable estimatedRowHeight
auf einen Wert zu setzen, der größer ist als alles, was ich für die Daten, die ich anzeigen wollte, für möglich hielt.
Aus irgendeinem Grund stellte dies sicher, dass die estimatedRowHeight
-Eigenschaft nicht zur Bestimmung der contentSize
verwendet wurde. Ich zeige den Scroll-Indikator nicht an, daher war es mir egal, dass die estimatedRowHeight
weg war.
In meinem Fall verwende ich nicht die Höhenbeschränkung von tableView. Bei Verwendung des automatischen Layouts werden die obere und untere Einschränkung festgelegt und nur die untere Einschränkung ändert sich, wenn der Bearbeitungsmodus aktiviert wird.
Tzegenos 'Antwort wird auf diese Weise geändert: 1. addiere tableView.estimatedRowHeight = 0
in viewDidLoad () 2. Folgendes hinzufügen:
override func viewDidLayoutSubviews() {
// 60 is row's height as set by tableView( cellRowAt )
// places is of type [String] to be used by tableView
tableView.contentSize.height = 60 * CGFloat(places.count)
}
Sie können UITableView
auch als Unterklasse klassifizieren und die gewünschte Person (d. H. Die Containeransicht) von layoutSubviews()
aus aufrufen, wo Sie definitiv eine contentSize
-Instanz haben.
für Swift einfach verwenden
tableView.invalidateIntrinsicContentSize()
tableView.layoutIfNeeded()
nach reloadData () und
tableView.contentSize.height
funktioniert perfekt . Beispiel auf Medium