Changing Font Size For UITableView Section Headers Changing Font Size For UITableView Section Headers swift swift

Changing Font Size For UITableView Section Headers


Another way to do this would be to respond to the UITableViewDelegate method willDisplayHeaderView. The passed view is actually an instance of a UITableViewHeaderFooterView.

The example below changes the font, and also centers the title text vertically and horizontally within the cell. Note that you should also respond to heightForHeaderInSection to have any changes to your header's height accounted for in the layout of the table view. (That is, if you decide to change the header height in this willDisplayHeaderView method.)

You could then respond to the titleForHeaderInSection method to reuse this configured header with different section titles.

Objective-C

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {    UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;    header.textLabel.textColor = [UIColor redColor];    header.textLabel.font = [UIFont boldSystemFontOfSize:18];    CGRect headerFrame = header.frame;    header.textLabel.frame = headerFrame;    header.textLabel.textAlignment = NSTextAlignmentCenter;}

Swift 1.2

(Note: if your view controller is a descendant of a UITableViewController, this would need to be declared as override func.)

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {    let header:UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView    header.textLabel.textColor = UIColor.redColor()    header.textLabel.font = UIFont.boldSystemFontOfSize(18)    header.textLabel.frame = header.frame    header.textLabel.textAlignment = NSTextAlignment.Center}

Swift 3.0

This code also ensures that the app doesn't crash if your header view is something other than a UITableViewHeaderFooterView:

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {    guard let header = view as? UITableViewHeaderFooterView else { return }    header.textLabel?.textColor = UIColor.red    header.textLabel?.font = UIFont.boldSystemFont(ofSize: 18)    header.textLabel?.frame = header.bounds    header.textLabel?.textAlignment = .center}


Unfortunately, you may have to override this:

In Objective-C:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

In Swift:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?

Try something like this:

In Objective-C:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {    UILabel *myLabel = [[UILabel alloc] init];    myLabel.frame = CGRectMake(20, 8, 320, 20);    myLabel.font = [UIFont boldSystemFontOfSize:18];    myLabel.text = [self tableView:tableView titleForHeaderInSection:section];    UIView *headerView = [[UIView alloc] init];    [headerView addSubview:myLabel];    return headerView;}

In Swift:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {    let myLabel = UILabel()    myLabel.frame = CGRect(x: 20, y: 8, width: 320, height: 20)    myLabel.font = UIFont.boldSystemFont(ofSize: 18)    myLabel.text = self.tableView(tableView, titleForHeaderInSection: section)    let headerView = UIView()    headerView.addSubview(myLabel)    return headerView}


While mosca1337's answer is a correct solution, be careful with that method. For a header with text longer than one line, you will have to perform the calculations of the height of the header in tableView:heightForHeaderInSection: which can be cumbersome.

A much preferred method is to use the appearance API:

[[UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setFont:[UIFont boldSystemFontOfSize:28]];

This will change the font, while still leaving the table to manage the heights itself.

For optimal results, subclass the table view, and add it to the containment chain (in appearanceWhenContainedIn:) to make sure the font is only changed for the specific table views.