Leider können Tabellenkopfansichten nicht mithilfe des automatischen Layouts skaliert werden. Sie können das automatische Layout für Elemente innerhalb der Kopfzeile verwenden, Sie müssen jedoch die Größe der Kopfzeile angeben, indem Sie ihren Rahmen explizit festlegen. Wenn die Höhe des Headers statisch und zum Zeitpunkt der Kompilierung bekannt ist, können Sie IB verwenden. Wenn die Höhe jedoch dynamisch ist oder vom Gerät abhängt (wie in Ihrem Fall), müssen Sie es in Code einstellen.
Eine ziemlich flexible Lösung wäre, eine benutzerdefinierte Unterklasse von UITableView
zu erstellen und den Rahmen des Headers in der layoutSubviews
-Methode anzupassen. Auf diese Weise wird die Größe des Headers automatisch angepasst, wenn die Größe der Tabelle geändert wird. Sie müssen jedoch darauf achten, den Rahmen des Headers nur dann erneut anzuwenden, wenn eine Änderung tatsächlich erforderlich ist, um eine Endlosschleife zu vermeiden.
Hier ist, was es in Objective-C aussehen würde:
@interface MyTableView : UITableView
@end
@implementation MyTableView : UITableView
- (void)layoutSubviews {
[super layoutSubviews];
if (self.tableHeaderView) {
UIView *header = self.tableHeaderView;
CGRect rect = CGRectMake(0, 0, self.bounds.size.width,
self.bounds.size.height/2);
// Only adjust frame if needed to avoid infinite loop
if (!CGRectEqualToRect(self.tableHeaderView.frame, rect)) {
header.frame = rect;
// This will apply the new header size and trigger another
// call of layoutSubviews
self.tableHeaderView = header;
}
}
}
@end
Die Swift-Version wie folgt aussieht:
class MyTableView: UITableView {
override func layoutSubviews() {
super.layoutSubviews()
if let header = tableHeaderView {
let rect = CGRectMake(0, 0, bounds.size.width, bounds.size.height/2)
// Only adjust frame if needed to avoid infinite loop
if !CGRectEqualToRect(header.frame, rect) {
header.frame = rect
// This will apply the new header size and trigger
// another call of layoutSubviews
tableHeaderView = header
}
}
}
}
Beachten Sie, dass die oben genannten Schnipsel die Grenzen der Tabellenansicht verwenden, anstatt die Bildschirmgröße, um die Kopfzeilengröße zu berechnen.
Aktualisierung: Beachten Sie, dass nach dem Festlegen der Eigenschaft tableHeaderView
manchmal ein zusätzlicher Aufruf von layoutIfNeeded
erforderlich ist. Ich stieß auf ein Problem, bei dem Abschnittsüberschriften über die Kopfzeile gezogen wurden, ohne layoutIfNeeded
aufzurufen.
Fügen Sie eine Höhenbeschränkung für die Header-Ansicht in Interface Builder hinzu und ziehen Sie sie in die Header-Datei, um ein IBOutlet zu erstellen. Setzen Sie in viewDidLoad den Wert der Integritätsbedingung auf 'yourOutlet.constant = [[UIScreen mainScreen] bounds] .size.height/2'.Bei der Drehung müssen Sie auch die Konstante zurücksetzen. –
Vielen Dank, aber ich kann keine Einschränkung auf die uiview-Header-Ansicht hinzugefügt haben, ich habe die Frage aktualisiert und ein Bild angehängt. Schauen Sie sich bitte den Abschnitt "Bearbeiten" meiner Frage an. – Aladin
Ja, scheint Probleme mit Einschränkungen zu haben der Tabellenkopf Habe eine einfache Arbeitslösung für dich gepostet. –