2017-07-07 6 views
1

Dies ist ein Problem, das mich schon seit einiger Zeit nervt.TableView Ändern der Größe der Elternansicht iOS

Nehmen Sie eine Ansicht an, die eine TableView mit X-Elementen enthält. Das Ziel besteht darin, die Größe dieser Ansicht so zu ändern, dass sie so hoch wie der Inhalt von tableView ist.

Ein Ansatz

den Inhalt des Tableview insgesamt berechnen (beispiel wenn 5 Zeilen und jeweils 50 Einheiten hoch, es ist nur eine Multiplikation Angelegenheit). Setzen Sie dann die TableView-Einschränkung auf eine 0 0 0 0 in die Ansicht und legen Sie die Ansichtshöhe auf 250 fest.

Dies funktioniert gut für feste Zellengrößen. Jedoch!

a) Wie wäre das Problem für die dynamische Höhe Zellen jedoch mit komplexen Randbedingungen in einem Szenario angefahren werden, wo Größenanpassung automatisch und die tableHeightForRow passiert ist auf UITableViewAutomaticDimension?

b) Eine Idee könnte tableView.contentSize verwenden. Wann würden wir diesen Wert jedoch sicher abrufen, um den übergeordneten Ansichtsrahmen entsprechend zu setzen? Ist das überhaupt möglich?

Vielen Dank allen

+0

Uhhhh ... Sollte die Tabellenansicht nicht in der Lage sein, Inhalte zu scrollen, wenn mehr Zellen hinzugefügt werden? Nehmen wir an, 1000 Zellen werden hinzugefügt, Sie müssen Scroll aktivieren, richtig? –

+0

Im Falle von 1000 Artikeln sicher. Aber oft haben Sie vielleicht eine Kombination von 6 Artikeln, von denen Sie nicht wissen, welche angezeigt werden. In meinem Fall mache ich eine benutzerdefinierte Ansicht, die über einer Map-Pin angezeigt wird, die eine E-Mail, Telefon, Titel, Öffnungszeiten, Eröffnungstage und ein paar mehr Dinge enthält. Nicht alle diese Informationen sind immer verfügbar. –

+0

Vielleicht werden diese 6 Elemente in einer Woche zu 7 und vielleicht wird der dritte Artikel in einem Monat aus der Spezifikation gelöscht. Eine Tabelle (ich nehme an, korrigiere mich wenn falsch) ist einfacher mit einer Variablenansicht wie dieser umzugehen. Eine Alternative wäre, eine statische Ansicht über die andere zu setzen und sie relativ zu beschränken, aber dies wäre weniger einfach zu pflegen als eine Tabelle. Recht? –

Antwort

1

Wenn Sie eine UITableView Unterklasse haben, können Sie eine Eigenschaft Beobachter auf der contentSize wie folgt aufgebaut:

override var contentSize: CGSize { 
     didSet { 
      // make delegate call or use some other mechanism to communicate size change to parent 
     } 
    } 

Der einfachste Ansatz zu dieser meiner Meinung nach ist Automatische Anordnung zu verwenden, . Wenn Sie diesen Ansatz verwenden, können Sie contentSize verwenden, um automatisch die intrinsicContentSize ungültig zu machen, die das automatische Layout verwendet, um Elemente dynamisch zu bestimmen (solange sie keine Platzierungsbeschränkungen mit höherer Priorität haben, die ihre Größe einschränken oder explizit festlegen).

Etwas wie folgt aus:

override var contentSize: CGSize { 
     didSet { 
      self.invalidateIntrinsicContentSize() 
     } 
    } 

override var intrinsicContentSize: CGSize { 
     return contentSize 
    } 

Dann fügen Sie einfach Ihren Tisch im Hinblick auf Ihre übergeordneten Ansicht Hierarchie mit gültigen Platzierungsbedingungen und einem Gehalt umarmen/Kompressionswiderstand von erforderlich.

Verwandte Themen