webentwicklung-frage-antwort-db.com.de

UITableView-Inhaltsgröße bei Verwendung des automatischen Layouts

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.

18
OnkarK

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.

31
OnkarK

Zum Schluss habe ich dein Problem verstanden und hier ist die Lösung davon.

Ich hoffe du hast das schon gemacht.

  1. Nehmen Sie zunächst eine feste Höhe von UITableView.
  2. Nehmen Sie dann die Einschränkung IBOutlet von UITableView Height.
  3. Dann können Sie unter 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.

11
Sohil R. Memon

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
4
Tzegenos

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
            }
        }
    }
}
2
flo bee

Sie können zwei Dinge ausprobieren,

  1. 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];
      });
    }
    
  2. 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.

2
Bharat Modi

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.

1
Stefan S

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)
}
0
Brian Hong

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.

0
nikans

für Swift einfach verwenden

tableView.invalidateIntrinsicContentSize()
tableView.layoutIfNeeded()

nach reloadData () und 

tableView.contentSize.height

funktioniert perfekt . Beispiel auf Medium

0
Daniil Chuiko