Variable-height UITableView tableHeaderView with autolayout
// in a UITableViewController (or any other view controller with a UITableView)
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, size.width, 0)];
header.translatesAutoresizingMaskIntoConstraints = NO;
// [add subviews and their constraints to header]
NSLayoutConstraint *headerWidthConstraint = [NSLayoutConstraint
constraintWithItem:header attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual
toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:size.width
];
[header addConstraint:headerWidthConstraint];
CGFloat height = [header systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
[header removeConstraint:headerWidthConstraint];
header.frame = CGRectMake(0, 0, size.width, height);
header.translatesAutoresizingMaskIntoConstraints = YES;
self.tableView.tableHeaderView = header;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self viewWillTransitionToSize:self.tableView.bounds.size withTransitionCoordinator:nil];
}