kdarty
10/21/2014 - 1:49 PM

Variable-height UITableView tableHeaderView with autolayout

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];
}