Почему tableVieW: viewForHeaderInSection игнорирует свойство frame моей UILabel? - PullRequest
16 голосов
/ 11 февраля 2011

В основном я хочу изменить шрифт и цвет заголовка моего раздела, поэтому я реализую tableVieW:viewForHeaderInSection. Сначала я попробовал этот код:

-(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;
}

но по какой-то причине свойство frame игнорируется (я говорю о вставке 10px слева). Теперь я использую следующее:

-(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;
}

с желаемыми результатами. Может кто-нибудь объяснить мне, почему второй подход работает, а первый нет?

PS. В обоих случаях я также реализую tableView:heightForHeaderInSection, возвращая 40.0

Ответы [ 2 ]

26 голосов
/ 11 февраля 2011

Это потому, что UITableView автоматически устанавливает рамку представления заголовка, которое вы предоставляете, равным

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

y - это вычисленная позиция представления, а header view height - это значениевозвращается tableView:heightForHeaderInSection:

1 голос
/ 10 декабря 2015

Может быть, лучше добавить подпредставление:

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