For many who use UITableView, unless you’re doing something like a Contacts application, the tableHeaderView (and related, tableFooterView) are rarely used.
What’s even more perplexing (at least when at first experienced), is that these elements are not repainted when a [UITableView reloadData] is issued; you have to manually issue field / image resets yourself.
Sometimes – like when handling a variable amount of data in the header, say for user status messages – you even have to adjust the size of the tableHeaderView in order to accomodate a growing / shrinking amount of real estate.
Here’s the trick:
CGRect headerFrame = self.profile.tableHeaderView.frame;
headerFrame.size.height = self.myStatus.frame.size.height + offset;
self.header.frame = headerFrame;
self.profile.tableHeaderView = self.header;
First, grab the current header frame. Then, adjust the size of the frame (in my example, I’m adjusting the height only). Then, reset the tableHeaderView with the view again.
This is important – the size will not be adjusted until the tableHeaderView (or tableFooterView) variable is reset.
That’s it.
Hope this helps some of you struggling with this not-so-well documented problem.
Thanks for posting this. I had spent ages trying all combinations of “setNeedsDisplay on the view and tableViews as well as reloadData 🙂
LikeLike
Thank you David, that was extremely helpful.
LikeLike
Thanks, helped me out!
LikeLike
That’s a great tip. I added this snippet to viewForHeaderInSection method but when I scroll the table, tableview resets the header height. Where else do I need to add this code so it stays same on scroll as well. Sorry I’m new to iPhone development.
LikeLike
According to the official documentation (https://developer.apple.com/library/ios/documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html#jumpTo_25) you should also implement tableView:heightForHeaderInSection:
LikeLike
Nice, very nice !
… and did you find a way to make it animated ? 🙂
LikeLike
just in case someone will need it in future:
[UIView animateWithDuration:0.5 animations:^
{
CGRect headerFrame = self.profile.tableHeaderView.frame;
headerFrame.size.height = self.myStatus.frame.size.height + offset;
self.header.frame = headerFrame;
self.profile.tableHeaderView = self.header;
}];
will do the trick 🙂
LikeLike
thanks!
LikeLike
Thanks from France David !
LikeLike