Resizing a UITableView’s tableHeaderView

Resizing a UITableView’s tableHeaderView

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.

9 thoughts on “Resizing a UITableView’s tableHeaderView

  1. Thanks for posting this. I had spent ages trying all combinations of “setNeedsDisplay on the view and tableViews as well as reloadData 🙂

    Like

  2. 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.

    Like

    1. 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 🙂

      Like

Leave a comment