Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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

like image 789
phi Avatar asked Feb 11 '11 14:02

phi


2 Answers

Maybe it's better do add a subview:

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let view = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
    let label = UILabel(frame: CGRect(x: 15, y: 5, width: tableView.frame.width, height: 20))
    label.text = "\(sections[section].year)"
    view.addSubview(label)
    return view
}
like image 31
Timm Kent Avatar answered Nov 14 '22 08:11

Timm Kent


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:

like image 117
Jilouc Avatar answered Nov 14 '22 10:11

Jilouc