Да, кажется странным / избыточным, что вы должны создать оба представления, а затем определить размер этого представления как совершенно отдельное событие, но вы можете минимизировать глупость, переместив часть этой общей логики в какой-то общий метод , Например, вам, вероятно, придется определить размер представления в какой-то момент во время его создания, поэтому перенесите эту логику в какой-то общий метод.
Например, у меня есть логика, которую я использую для определения размера UILabel, который я помещаю в свой заголовок, основываясь на размере текста. Поэтому я извлек это из моего viewForHeaderInSection
и переместил его в свой собственный метод sizeForHeaderLabelInSection
, который я использую для определения размера элемента управления меткой):
- (CGSize)tableView:(UITableView *)tableView sizeForHeaderLabelInSection:(NSInteger)section
{
NSString *text = [self tableView:tableView titleForHeaderInSection:section];
CGSize constraint = CGSizeMake(self.view.frame.size.width - kSectionTitleLeftMargin - kSectionTitleRightMargin, kMaxSectionTitleHeight);
return [text sizeWithFont:[self fontForSectionHeader] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
}
Затем я изменил стандарт heightForHeaderInSection
, чтобы использовать этот метод, добавив, конечно, мой верхний и нижний поля вокруг моей UILabel:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return [self tableView:tableView sizeForHeaderLabelInSection:section].height + kSectionTitleTopMargin + kSectionTitleBottomMargin;
}
А затем я изменил стандарт viewForHeaderInSection
, чтобы также использовать этот sizeForHeaderLabelInSection
:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
CGSize size = [self tableView:tableView sizeForHeaderLabelInSection:section];
UIView* headerView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, size.width + kSectionTitleLeftMargin + kSectionTitleRightMargin, size.height + kSectionTitleTopMargin + kSectionTitleBottomMargin)];
//headerView.contentMode = UIViewContentModeScaleToFill;
// Add the label
UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(kSectionTitleLeftMargin,
kSectionTitleTopMargin,
size.width,
size.height)];
// put stuff to set up my headerLabel here...
[headerView addSubview:headerLabel];
// Return the headerView
return headerView;
}
Ясно, как вы это делаете, полностью зависит от вас и от того, чего вы пытаетесь достичь. Но я думаю, что вы добьетесь успеха, если вы переключите свое мышление с «как мне определить размер того представления, которое я создал в viewForHeaderInSection
», на «как я могу переместить код, который я использовал для определения размера в viewForHeaderInSection
в некоторый общий метод, который может использовать мой heightForSectionInHeader
.