Ich habe Probleme beim Ändern der Größe einer tableHeaderView. Es funktioniert einfach nicht.
1) Erstellen Sie eine UITableView und eine UIView (100 x 320 px).
2) Legen Sie die UIView als tableHeaderView der UITableView fest.
3) Bauen und loslegen. Alles ist ok.
Jetzt möchte ich die Größe der tableHeaderView ändern, also füge ich diesen Code in viewDidLoad hinzu:
self.tableView.autoresizesSubviews = YES;
self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;
CGRect newFrame = self.tableView.tableHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
self.tableView.tableHeaderView.frame = newFrame;
Die Höhe der tableHeaderView sollte mit 200, aber mit 100 angezeigt werden.
Wenn ich schreibe:
self.tableView.autoresizesSubviews = YES;
CGRect newFrame = myHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
myHeaderView.frame = newFrame;
self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;
Dann beginnt es mit 200 Höhenmetern, wie ich will. Aber ich möchte es in der Laufzeit ändern können.
Ich habe es auch ohne Erfolg versucht:
self.tableView.autoresizesSubviews = YES;
self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;
CGRect newFrame = self.tableView.tableHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
self.tableView.tableHeaderView.frame = newFrame;
[self.tableView.tableHeaderView setNeedsLayout];
[self.tableView.tableHeaderView setNeedsDisplay];
[self.tableView setNeedsLayout];
[self.tableView setNeedsDisplay];
Der Punkt hier ist: Wie ändern wir die Größe einer tableHeaderView zur Laufzeit ???
Kann jemand das tun?
Vielen Dank
iMe
[tableView recalculateHeaderHeight]
jedes Mal so etwas aufrufen müssen .setTableHeaderView:
Anruf mit[tableview beginUpdates]
und[tableview endUpdates]
Diese Antwort ist alt und funktioniert anscheinend nicht unter iOS 7 und höher.
Ich bin auf dasselbe Problem gestoßen und wollte auch, dass die Änderungen animiert werden. Deshalb habe ich eine Unterklasse von UIView für meine Header-Ansicht erstellt und die folgenden Methoden hinzugefügt:
Dadurch werden im Wesentlichen alle Unteransichten der UITableView animiert, die nicht denselben Klassentyp wie die aufrufende Klasse haben. Am Ende der Animation wird setTableHeaderView in der Übersicht (UITableView) aufgerufen. Ohne diese Option springt der UITableView-Inhalt beim nächsten Bildlauf zurück. Die einzige Einschränkung, die ich bisher gefunden habe, ist, wenn der Benutzer versucht, die UITableView zu scrollen, während die Animation stattfindet, wird das Scrollen so animiert, als ob die Größe der Kopfzeilenansicht nicht geändert worden wäre (keine große Sache, wenn die Animation ist schnell).
quelle
Wenn Sie die Änderungen unter bestimmten Bedingungen animieren möchten, können Sie Folgendes tun:
Bitte beachten Sie, dass die Animation zweifach gefaltet ist:
tableHeaderView
. Dies geschieht mitbeginUpdates
undendUpdates
UIView
Animationsblock.Um diese beiden Animationen zu synchronisieren
animationCurve
, muss dieUIViewAnimationCurveEaseInOut
und die Dauer0.3
auf eingestellt werden. Dies scheint das zu sein, was UITableView für seine Animation verwendet.Aktualisieren
Ich habe ein Xcode-Projekt auf gihub erstellt, das dies tut. Schauen Sie sich das Projekt
ResizeTableHeaderViewAnimated
in besi / ios-quickies anquelle
Ich denke, es sollte funktionieren, wenn Sie einfach die Höhe von myHeaderView so einstellen:
quelle
Verwendete @ Garrettmoon-Lösung oben bis iOS 7.
Hier ist eine aktualisierte Lösung, die auf @ Garrettmoon basiert:
quelle
Dies funktionierte für mich unter iOS 7 und 8. Dieser Code wird auf dem Table View Controller ausgeführt.
quelle
Es liegt daran, dass der Setter von tableHeaderView.
Sie müssen die UIView-Höhe festlegen, bevor Sie tableHeaderView festlegen können. (Wäre viel einfacher, wenn Apple dieses Framework als Open Source anbietet ...)
quelle
Unter iOS 9 und niedriger
tableHeaderView
das Layout nach dem Ändern der Größe nicht neu gestaltet. Dieses Problem wurde in iOS 10 behoben.Um dieses Problem zu lösen, führen Sie einfach den folgenden Code aus:
quelle
Unter iOS 9.x
viewDidLoad
funktioniert dies einwandfrei:headerView
wird@IBOutlet var headerView: UIView!
im Storyboard als deklariert und verbunden, wo es oben in der tableView platziert wird, um als tableHeaderView zu fungieren.quelle
Dies gilt nur, wenn Sie das automatische Layout verwenden und festlegen
translatesAutoresizingMaskIntoConstraints = false
eine benutzerdefinierte Kopfzeilenansicht .Der beste und einfachste Weg ist das Überschreiben
intrinsicContentSize
. Wird internUITableView
verwendetintrinsicContentSize
, um die Größe der Kopf- / Fußzeile zu bestimmen. Sobald SieintrinsicContentSize
Ihre benutzerdefinierte Ansicht überschrieben haben , müssen Sie wie folgt vorgeheninvalidateIntrinsicContentSize()
tableView.setNeedsLayout()
undtableView.layoutIfNeeded()
Dann wird die
UITableView
Kopf- / Fußzeile des Benutzers nach Ihren Wünschen aktualisiert. Sie müssen die Ansicht nicht auf Null setzen oder zurücksetzen.Eine Sache, die für das
UITableView.tableHeaderView
oder wirklich interessant.tableFooterView
ist, ist, dass esUIStackView
seine Fähigkeit verliert, es zu verwaltenarrangedSubviews
. Wenn Sie verwenden möchten ,UIStackView
als tableHeaderView oder tableFooterView, Sie haben die stackView in ein einbettenUIView
und überschreibenUIView
‚sintrinsicContentSize
.quelle
Für schnelle 5 Getesteten Code
Hinweis: Sie müssen alle Einschränkungen der Unteransicht von oben, unten, oben und unten angeben. So wird es die gesamte benötigte Größe bekommen.
Referenz entnommen aus: https://useyourloaf.com/blog/variable-height-table-view-header/
quelle
Das Festlegen der Höhe für die Header-Ansichtseigenschaft
tableView.tableHeaderView
inviewDidLoad
scheint nicht zu funktionieren. Die Höhe der Header-Ansicht ändert sich immer noch nicht wie erwartet.Nach dem Kampf gegen dieses Problem für viele Versuche. Ich habe festgestellt, dass Sie die Höhe ändern können, indem Sie die Erstellungslogik der Header-Ansicht innerhalb der
- (void)didMoveToParentViewController:(UIViewController *)parent
Methode aufrufen .Der Beispielcode würde also so aussehen:
quelle
Ich habe festgestellt, dass der initWithFrame-Initialisierer eines UIView das von mir übergebene Rect nicht richtig berücksichtigt. Daher habe ich Folgendes getan, was perfekt funktioniert hat:
Dies hat den Vorteil, dass es besser in Ihren Ansichtscode eingekapselt ist.
quelle
UIScreen
ist eine schlechte Idee. Wie werden Sie Ihre Ansicht wiederverwenden?Ich habe eine animierte Höhenänderung der Kopfzeile der Tabelle implementiert, um sie beim Tippen auf den Gesamtbildschirm zu erweitern. Der Code kann jedoch in anderen Fällen hilfreich sein:
quelle
UITableView-Header zur Größenänderung - UISearchBar mit Bereichsleiste
Ich wollte ein
UITableView
mit einemUISearchBar
als Überschrift für die Tabelle, also habe ich eine Hierarchie, die so aussiehtUISearchBarDelegate-Methoden
Wie bereits an anderer Stelle erwähnt, geschieht nichts, wenn Sie TableViewHeader nach dem Ändern nicht festlegen.
quelle
Wenn die benutzerdefinierte headerView mit Autolayout erstellt wurde und headerView nach dem Webabruf oder einer ähnlichen verzögerten Aufgabe aktualisiert werden muss. dann habe ich dies in iOS-Swift getan und meine Header-Ansicht mit folgendem Code aktualisiert:
quelle
Offensichtlich sollte Apple jetzt UITableViewAutomaticDimension für tableHeaderView & tableFooterView implementiert haben ...
Folgendes scheint für mich mit Layout-Kontraint (s) zu funktionieren:
quelle
Wenn Ihre tableHeaderView eine inhaltsanpassbare WebView ist, können Sie Folgendes versuchen:
Ich habe es auf iOS9 und iOS11 getestet und gut funktioniert.
quelle
Haben Sie es
[self.tableView reloadData]
nach dem Ändern der Höhe versucht ?quelle
- [UITableView reloadData]
ist nur für die dynamischen Ansichten (Zellen) und auch die sectionHeaders gedacht, von denen Sie offensichtlich dachten, dass sie gemeint sind;)