Ich erstelle eine App, in der eine Frage in einer UILabel
und eine Multiple-Choice-Antwort angezeigt UITableView
werden. Jede Zeile zeigt eine Multiple-Choice- Antwort . Fragen und Antworten variieren, daher muss diese UITableView
Höhe dynamisch sein.
Ich würde gerne eine sizeToFit
Arbeit für den Tisch finden. Wo der Rahmen der Tabelle auf die Höhe des gesamten Inhalts eingestellt ist.
Kann mir jemand raten, wie ich das erreichen kann?
- sizeToFit
Methode ausprobiert oder nicht ?Antworten:
Eigentlich habe ich die Antwort selbst gefunden.
Ich erstelle gerade ein neues
CGRect
für dastableView.frame
mit demheight
vontable.contentSize.height
Das setzt die Höhe des
UITableView
auf denheight
Inhalt. Da der Code die Benutzeroberfläche ändert, vergessen Sie nicht, ihn im Hauptthread auszuführen:quelle
Schnelle 5 und 4.2-Lösung ohne KVO, DispatchQueue oder das Festlegen von Einschränkungen.
Diese Lösung basiert auf Gulz 'Antwort .
1) Erstellen Sie eine Unterklasse von
UITableView
:2) Fügen Sie
UITableView
Ihrem Layout ein hinzu und legen Sie auf allen Seiten Einschränkungen fest. Setzen Sie die Klasse aufContentSizedTableView
.3) Sie sollten einige Fehler sehen, da Storyboard unsere Unterklasse nicht
intrinsicContentSize
berücksichtigt. Beheben Sie dies, indem Sie den Größeninspektor öffnen und die intrinsicContentSize auf einen Platzhalterwert überschreiben. Dies ist eine Überschreibung für die Entwurfszeit. Zur Laufzeit wird die Überschreibung in unsererContentSizedTableView
Klasse verwendetUpdate: Code für Swift 4.2 geändert. Wenn Sie eine frühere Version verwenden, verwenden Sie
UIViewNoIntrinsicMetric
anstelle vonUIView.noIntrinsicMetric
quelle
tableView
, umIntrinsicTableView
im Storyboard zu sein. Ich musste meine Tabellenansicht nicht in eine andere einbettenUIView
.tableView
zuIntrinsicTableView
. Auch eine zusätzliche VerpackungUIView
ist nicht erforderlich. Sie können natürlich jede vorhandene übergeordnete Ansicht verwenden :)tableView.sizeToFit()
sizeToFit()
aufgerufen werden mussSchnelle Lösung
Folge diesen Schritten:
1- Legen Sie die Höhenbeschränkung für die Tabelle im Storyboard fest.
2- Ziehen Sie die Höhenbeschränkung aus dem Storyboard und erstellen Sie ein @IBOutlet dafür in der View Controller-Datei.
3- Dann können Sie die Höhe für die Tabelle dynamisch mit diesem Code ändern:
Aktualisieren
Wenn die letzte Zeile für Sie ausgeschnitten ist, versuchen Sie, viewWillLayoutSubviews () in der willDisplay-Zellenfunktion aufzurufen:
quelle
Ich habe dies in iOS 7 versucht und es hat bei mir funktioniert
quelle
Fügen Sie in der Tabellenansicht einen Beobachter für die contentSize-Eigenschaft hinzu und passen Sie die Rahmengröße entsprechend an
dann im Rückruf:
Hoffe das wird dir helfen.
quelle
Ich hatte eine Tabellenansicht in der Bildlaufansicht und musste die Höhe von tableView berechnen und die Größe entsprechend ändern. Das sind Schritte, die ich unternommen habe:
0) Fügen Sie Ihrer scrollView eine UIView hinzu (funktioniert wahrscheinlich ohne diesen Schritt, aber ich habe es getan, um mögliche Konflikte zu vermeiden) - dies ist eine Containr-Ansicht für Ihre Tabellenansicht. Wenn Sie diesen Schritt ausführen, setzen Sie die Ansichtsrahmen direkt auf die der Tabellenansicht.
1) Erstellen Sie eine Unterklasse von UITableView:
2) Setzen Sie die Klasse einer Tabellenansicht im Storyboard auf IntrinsicTableView: Screenshot: http://joxi.ru/a2XEENpsyBWq0A
3) Stellen Sie die heightConstraint auf Ihre Tabellenansicht ein
4) Ziehen Sie das IBoutlet Ihrer Tabelle auf Ihren ViewController
5) Ziehen Sie das IBoutlet der Höhenbeschränkung Ihrer Tabelle auf Ihren ViewController
6) Fügen Sie diese Methode Ihrem ViewController hinzu:
Hoffe das hilft
quelle
Falls Sie die Änderungen der Inhaltsgröße der Tabellenansicht nicht selbst verfolgen möchten, ist diese Unterklasse möglicherweise hilfreich.
quelle
override public var intrinsicContentSize: CGSize { //... return someCGSize }
Falls Ihre contentSize nicht korrekt ist, liegt dies daran, dass sie auf der geschätzten Zeilenhöhe (automatisch) basiert. Verwenden Sie diese zuvor
Quelle: https://forums.developer.apple.com/thread/81895
quelle
Swift 3, iOS 10.3
Lösung 1: Einfach
self.tableview.sizeToFit()
incellForRowAt indexPath
Funktion setzen. Stellen Sie sicher, dass die Höhe der Tabellenansicht höher als erforderlich ist. Dies ist eine gute Lösung, wenn Sie keine Ansichten unterhalb der Tabellenansicht haben. Wenn dies jedoch der Fall ist, wird die Einschränkung für die untere Tabellenansicht nicht aktualisiert (ich habe nicht versucht, sie zu beheben, da ich Lösung 2 gefunden habe).Beispiel:
Lösung 2: Legen Sie die Höhenbeschränkung für die Tabellenansicht im Storyboard fest und ziehen Sie sie auf den ViewController. Wenn Sie die durchschnittliche Höhe Ihrer Zelle kennen und wissen, wie viele Elemente Ihr Array enthält, können Sie Folgendes tun:
*BEARBEITEN:
Nach all den Lösungen, die ich ausprobiert habe und von denen jeder etwas repariert hat, aber nicht vollständig, ist dies die Antwort, die dieses Problem erklärt und vollständig behebt.
quelle
Mimo Antwort und Anooj VM ‚s Antwort beide sind genial , aber es ist ein kleines Problem , wenn Sie eine große Liste haben, ist es möglich , dass die Höhe des Rahmens werden einige Ihrer Zellen Cutoff.
So. Ich habe die Antwort ein wenig geändert:
quelle
Wenn Sie AutoLayout verwenden, gibt es eine viel bessere Möglichkeit: Ändern Sie die Einschränkung, die die Höhe bestimmt. Berechnen Sie einfach die Höhe Ihres Tabelleninhalts, suchen Sie die Einschränkung und ändern Sie sie. Hier ein Beispiel (unter der Annahme, dass die Einschränkung, die die Höhe Ihrer Tabelle bestimmt, tatsächlich eine Höhenbeschränkung mit der Beziehung "Gleich" ist):
quelle
myTableHeightConstraint.constant = tableView.contentSize.height
Dies funktioniert bei Verwendung des automatischen Layouts mit einer Tabellenansicht mit nur einem Abschnitt.
Ich rufe diese Funktion beim Einrichten des automatischen Layouts auf (Das Beispiel hier verwendet SnapKit, aber Sie haben die Idee):
Ich möchte, dass UITableView nur so hoch ist wie die kombinierte Höhe der Zellen. Ich durchlaufe die Zellen und sammle die Gesamthöhe der Zellen. Da die Größe der Tabellenansicht zu diesem Zeitpunkt CGRect.zero ist, muss ich die Grenzen festlegen, um die von der Zelle definierten Regeln für das automatische Layout einhalten zu können. Ich habe die Größe auf einen beliebigen Wert eingestellt, der groß genug sein sollte. Die tatsächliche Größe wird später vom Auto-Layout-System berechnet.
quelle
Ich habe es auf eine etwas andere Art gemacht. Eigentlich war meine TableView in der Bildlaufansicht, also musste ich die Höhenbeschränkung als 0 angeben.
Dann habe ich zur Laufzeit folgende Änderungen vorgenommen:
quelle
Als Erweiterung der Antwort von Anooj VM empfehle ich Folgendes, um die Inhaltsgröße nur zu aktualisieren, wenn sie sich ändert.
Dieser Ansatz deaktiviert auch das Scrollen ordnungsgemäß und unterstützt größere Listen und Rotationen . Dispatch_async ist nicht erforderlich, da Änderungen an contentSize im Hauptthread ausgelöst werden.
quelle
objc Version von Musa almatri
quelle
Sie können diese benutzerdefinierte ausprobieren
AGTableView
So legen Sie eine TableView-Höhenbeschränkung mithilfe des Storyboards oder programmgesteuert fest (Diese Klasse ruft automatisch eine Höhenbeschränkung ab und setzt die Höhe der Inhaltsansicht auf die Höhe Ihrer Tabellenansicht.)
Hinweis Wenn es Probleme beim Einstellen einer Höhe gibt, dann
yourTableView.layoutSubviews()
.quelle
Basierend auf der Antwort von fl034 . Aber für Xamarin.iOS- Benutzer:
quelle
Meine Swift 5-Implementierung besteht darin, die Höhenbeschränkung der tableView auf die Größe ihres Inhalts (
contentSize.height
) festzulegen . Diese Methode setzt voraus, dass Sie das automatische Layout verwenden. Dieser Code sollte in diecellForRowAt
tableView-Methode eingefügt werden.quelle
Wenn Ihre Tabelle dynamisch sein soll, müssen Sie eine Lösung verwenden, die auf dem oben beschriebenen Tabelleninhalt basiert. Wenn Sie einfach eine kleinere Tabelle anzeigen möchten, können Sie eine Containeransicht verwenden und einen UITableViewController darin einbetten. Die Größe der UITableView wird entsprechend der Containergröße geändert.
Dies vermeidet viele Berechnungen und Aufrufe des Layouts.
quelle
above
da die Antworten gemischt werden könnten.Mu Lösung dafür in schnell 3 : Rufen Sie diese Methode in
viewDidAppear
quelle