Why does tableVieW:viewForHeaderInSection ignore the frame property of my UILabel?

phi picture phi · Feb 11, 2011 · Viewed 14.2k times · Source

Basically I want to change the font and the color of my section header, so I implement tableVieW:viewForHeaderInSection. First I tried this code:

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UILabel* headerLabel = [[[UILabel alloc] init] autorelease];
    headerLabel.frame = CGRectMake(10, 0, 300, 40);
    headerLabel.backgroundColor = [UIColor clearColor];
    headerLabel.textColor = [UIColor blackColor];
    headerLabel.font = [UIFont boldSystemFontOfSize:18];
    headerLabel.text = @"My section header";

    return headerLabel;
}

but for some reason the frame property is ignored (I'm talking about the 10px inset on the left). Now I use the following:

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView* headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 40)] autorelease];

    UILabel* headerLabel = [[UILabel alloc] init];
    headerLabel.frame = CGRectMake(10, 0, 300, 40);
    headerLabel.backgroundColor = [UIColor clearColor];
    headerLabel.textColor = [UIColor blackColor];
    headerLabel.font = [UIFont boldSystemFontOfSize:18];
    headerLabel.text = @"My section header";

    [headerView addSubview:headerLabel];
    [headerLabel release];

    return headerView;
}

with the desired results. Can someone explain to me why the second approach works and the first doesn't?

PS. In both cases I implement tableView:heightForHeaderInSection as well, returning 40.0

Answer

Jilouc picture Jilouc · Feb 11, 2011

That's because the UITableView automatically sets the frame of the header view you provide to

(0, y, table view width, header view height)

y is the computed position of the view and header view height is the value returned by tableView:heightForHeaderInSection: