Estou batendo minha cabeça contra a parede com isso nas últimas 3 ou 4 horas e não consigo descobrir. Eu tenho um UIViewController com um UITableView de tela inteira dentro dele (há algumas outras coisas na tela, é por isso que não posso usar um UITableViewController) e quero que meu tableHeaderView redimensione com autolayout. Desnecessário dizer que não está cooperando.
Veja a imagem abaixo.
Como o overviewLabel (por exemplo, o texto "Listar informações gerais aqui.") Tem conteúdo dinâmico, estou usando o autolayout para redimensioná-lo e sua visualização. Eu tenho tudo redimensionado muito bem, exceto para o tableHeaderView, que está logo abaixo do Paralax Table View na pesquisa.
A única maneira que encontrei de redimensionar a visualização do cabeçalho é programaticamente, com o seguinte código:
CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = headerFrameHeight;
self.headerView.frame = headerFrame;
[self.listTableView setTableHeaderView:self.headerView];
Nesse caso, headerFrameHeight é um cálculo manual da altura de tableViewHeader da seguinte maneira (innerHeaderView é a área em branco ou a segunda "Visualização", 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);
O cálculo manual funciona, mas é desajeitado e sujeito a erros se as coisas mudarem no futuro. O que eu quero fazer é redimensionar automaticamente o tableHeaderView com base nas restrições fornecidas, como você faria em qualquer outro lugar. Mas pela minha vida, eu não consigo entender.
Existem vários posts no SO sobre isso, mas nenhum é claro e acabou me confundindo mais. Aqui estão alguns:
Realmente não faz sentido alterar a propriedade translatesAutoresizingMaskIntoConstraints para NO, já que isso apenas causa erros para mim e não faz sentido conceitualmente de qualquer maneira.
Qualquer ajuda seria realmente apreciada!
EDIT 1: Graças à sugestão de TomSwift, eu fui capaz de descobrir. Em vez de calcular manualmente a altura da visão geral, posso fazer com que ela seja calculada da seguinte maneira e, em seguida, reconfigure o tableHeaderView como antes.
[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];
Edição 2: como outros notaram, a solução postada na Edição 1 não parece funcionar em viewDidLoad. No entanto, parece funcionar em viewWillLayoutSubviews. Código de exemplo abaixo:
// 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
não funciona no Xcode6. O problema é que as células são sobrepostas por tableHeaderView. No entanto, funciona no Xcode5