Ho sbattuto la testa contro il muro con questo per le ultime 3 o 4 ore e non riesco a capirlo. Ho un UIViewController con un UITableView a schermo intero al suo interno (ci sono altre cose sullo schermo, motivo per cui non posso usare un UITableViewController) e voglio che il mio tableHeaderView venga ridimensionato con autolayout. Inutile dire che non sta collaborando.
Vedi screenshot qui sotto.
Poiché il overviewLabel (ad esempio il testo "List overview information here.") Ha un contenuto dinamico, sto usando il layout automatico per ridimensionarlo ed è superview. Ho tutto ridimensionato bene, ad eccezione di tableHeaderView, che si trova proprio sotto Paralax Table View nell'hiearchy.
L'unico modo che ho trovato per ridimensionare quella vista dell'intestazione è programmaticamente, con il seguente codice:
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = headerFrameHeight;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
In questo caso, headerFrameHeight è un calcolo manuale dell'altezza tableViewHeader come segue (innerHeaderView è l'area bianca, o la seconda "View", headerView è 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);
Il calcolo manuale funziona, ma è goffo e soggetto a errori se le cose cambiano in futuro. Quello che voglio essere in grado di fare è avere il ridimensionamento automatico tableHeaderView in base ai vincoli forniti, come puoi fare altrove. Ma per la vita di me, non riesco a capirlo.
Ci sono diversi post su SO su questo, ma nessuno è chiaro e ha finito per confondermi di più. Eccone alcuni:
Non ha davvero senso cambiare la proprietà translatesAutoresizingMaskIntoConstraints su NO, poiché ciò causa solo errori per me e non ha comunque senso concettualmente.
Qualsiasi aiuto sarebbe molto apprezzato!
EDIT 1: Grazie al suggerimento di TomSwift, sono stato in grado di capirlo. Invece di calcolare manualmente l'altezza della panoramica, posso farla calcolare per me come segue e quindi reimpostare tableHeaderView come prima.
[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];
Modifica 2: come altri hanno notato, la soluzione pubblicata in Modifica 1 non sembra funzionare in viewDidLoad. Tuttavia, sembra funzionare in viewWillLayoutSubviews. Codice di esempio di seguito:
// 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
non funziona su Xcode6. Il problema è che le celle sono sovrapposte da tableHeaderView. Tuttavia, funziona su Xcode5