У меня в настоящее время есть подкласс UIView, который действует как мой заголовок для моего UITableViewController. Все подпредставления различаются по размеру в зависимости от данных, полученных для конкретного элемента.
layoutSubViews вызывается для UIView, прежде чем я могу определить размер каждой метки. Это вызывает проблему, потому что я установил размер представления в методе layoutSubViews. Так как он вызывается до того, как я настрою свои метки, высота представлений всегда равна 0. Даже после настройки меток я вызываю setNeedsLayout, но размер заголовка табличных представлений не меняется.
Это создаст мой TableHeaderView и установит текст для моих меток.
TableHeaderView *tableHeaderView = [[TableHeaderView alloc] initWithFrame:CGRectZero];
tableHeaderView.headerTitle.text = title;
tableHeaderView.headerOption1.text = headerOption1
tableHeaderView.headerOption2.text = headerOption2
tableHeaderView.headerOption3.text = headerOption3
[[self tableView] setTableHeaderView:tableHeaderView];
[tableHeaderView setNeedsLayout];
[tableHeaderView release];
Вот мой подкласс UIView
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
UIView *headerView = self;
self.headerTitle = [[UILabel alloc] initWithFrame:CGRectZero];
self.headerTitle.numberOfLines = 3;
self.headerTitle.lineBreakMode = UILineBreakModeWordWrap;
[headerView addSubview:self.headerTitle];
[self.headerTitle release];
self.headerOption1 = [[UILabel alloc] initWithFrame:CGRectZero];
self.headerOption1.numberOfLines = 2;
self.headerOption1.lineBreakMode = UILineBreakModeWordWrap;
[headerView addSubview:self.headerOption1];
[self.headerOption1 release];
}
return self;
}
- (void)layoutSubviews {
[super layoutSubviews];
CGSize maxLabelSize;
/*...*/
[self.headerTitle setFrame:CGRectMake(10.0f, 10.0f, titleWidth, titleHeight)];
/*...*/
[self.headerOption1 setFrame:CGRectMake(10.0f, (self.headerTitle.frame.origin.y + self.headerTitle.bounds.size.height + 2.5f), pubWidth, pubHeight)];
/*...*/
[self setFrame:CGRectMake(0.0f, 0.0f, 320.0f, tableHeaderHeight)];
}
Во второй раз, когда layoutSubViews вызывается, все подпредставления получают правильный размер, за исключением самого представления (tableHeaderHeight имеет правильную высоту). Разве я не должен изменять размер представления из этого метода? Есть ли лучший подход к этому?