Ich habe in den letzten 3 oder 4 Stunden meinen Kopf gegen die Wand geschlagen und ich kann es scheinbar nicht herausfinden. Ich habe einen UIViewController mit einer UITableView im Vollbildmodus (es gibt einige andere Dinge auf dem Bildschirm, weshalb ich keinen UITableViewController verwenden kann) und ich möchte, dass meine tableHeaderView die Größe mit Autolayout ändert. Unnötig zu sagen, dass es nicht kooperiert.
Siehe Screenshot unten.
Da das Übersichtslabel (z. B. der Text "Übersichtsinformationen hier auflisten") dynamischen Inhalt hat, verwende ich das automatische Layout, um die Größe zu ändern und die Übersicht anzuzeigen. Ich habe alles schön in der Größe geändert, außer der tableHeaderView, die sich direkt unter Paralax Table View in der Hiearchy befindet.
Die einzige Möglichkeit, die Größe dieser Header-Ansicht zu ändern, ist programmgesteuert mit dem folgenden Code:
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = headerFrameHeight;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
In diesem Fall ist headerFrameHeight eine manuelle Berechnung der tableViewHeader-Höhe wie folgt (innerHeaderView ist der weiße Bereich oder die zweite "Ansicht", headerView ist tableHeaderView) :
CGFloat startingY = self.innerHeaderView.frame.origin.y + self.overviewLabel.frame.origin.y;
CGRect overviewSize = [self.overviewLabel.text
boundingRectWithSize:CGSizeMake(290.f, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName: self.overviewLabel.font}
context:nil];
CGFloat overviewHeight = overviewSize.size.height;
CGFloat overviewPadding = ([self.overviewLabel.text length] > 0) ? 10 : 0; // If there's no overviewText, eliminate the padding in the overall height.
CGFloat headerFrameHeight = ceilf(startingY + overviewHeight + overviewPadding + 21.f + 10.f);
Die manuelle Berechnung funktioniert, ist jedoch umständlich und fehleranfällig, wenn sich die Dinge in Zukunft ändern. Ich möchte in der Lage sein, die Größe von tableHeaderView basierend auf den bereitgestellten Einschränkungen automatisch zu ändern, wie Sie es überall tun können. Aber für mein Leben kann ich es nicht herausfinden.
Es gibt mehrere Beiträge zu SO darüber, aber keiner ist klar und hat mich mehr verwirrt. Hier sind einige:
Es ist nicht wirklich sinnvoll, die Eigenschaft translatesAutoresizingMaskIntoConstraints in NO zu ändern, da dies nur Fehler für mich verursacht und konzeptionell sowieso keinen Sinn ergibt.
Jede Hilfe wäre wirklich dankbar!
EDIT 1: Dank TomSwifts Vorschlag konnte ich es herausfinden. Anstatt die Höhe der Übersicht manuell zu berechnen, kann ich sie wie folgt für mich berechnen lassen und dann die tableHeaderView wie zuvor zurücksetzen.
[self.headerView setNeedsLayout];
[self.headerView layoutIfNeeded];
CGFloat height = [self.innerHeaderView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height + self.innerHeaderView.frame.origin.y; // adding the origin because innerHeaderView starts partway down headerView.
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = height;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
Bearbeiten 2: Wie andere angemerkt haben, scheint die in Bearbeiten 1 veröffentlichte Lösung in viewDidLoad nicht zu funktionieren. Es scheint jedoch in viewWillLayoutSubviews zu funktionieren. Beispielcode unten:
// Note 1: The variable names below don't match the variables above - this is intended to be a simplified "final" answer.
// Note 2: _headerView was previously assigned to tableViewHeader (in loadView in my case since I now do everything programatically).
// Note 3: autoLayout code can be setup programatically in updateViewConstraints.
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
[_headerWrapper setNeedsLayout];
[_headerWrapper layoutIfNeeded];
CGFloat height = [_headerWrapper systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
CGRect headerFrame = _headerWrapper.frame;
headerFrame.size.height = height;
_headerWrapper.frame = headerFrame;
_tableView.tableHeaderView = _headerWrapper;
}
setTableHeaderView
funktioniert nicht auf Xcode6. Das Problem ist, dass sich Zellen von tableHeaderView überlappen. Es funktioniert jedoch auf Xcode5