2

通常のものをプラグインしたテーブル ビューがあります。問題は UITableViewHeaderFooterView にあり、最初に表示されるときに異常なフレームがあります。しかし、下にスクロールして(再利用されたら)元に戻すと、問題なく表示されます。関連するコードは次のとおりです。

EDIT:一方、テーブルビューのセルは問題なく表示されます。

この行の headerView のログ FAQSectionHeaderView *headerView = [self.tableView dequeueReusableHeaderFooterViewWithIdentifier:@"HeaderView"]; これを示します:

2013-11-01 15:16:04.716 FAQDetail[27576:70b] header View <FAQSectionHeaderView: 0x8b582e0; baseClass = UITableViewHeaderFooterView; frame = (0 0; 0 0); text = ''; layer = <CALayer: 0x8b58420>> at Section 0
2013-11-01 15:16:04.718 FAQDetail[27576:70b] header View <FAQSectionHeaderView: 0xa83edc0; baseClass = UITableViewHeaderFooterView; frame = (0 0; 0 0); text = ''; layer = <CALayer: 0xa83ee80>> at Section 1
2013-11-01 15:16:04.719 FAQDetail[27576:70b] header View <FAQSectionHeaderView: 0x8c2f8e0; baseClass = UITableViewHeaderFooterView; frame = (0 0; 0 0); text = ''; layer = <CALayer: 0x8c2c370>> at Section 2
2013-11-01 15:16:04.719 FAQDetail[27576:70b] header View <FAQSectionHeaderView: 0x8a3f7a0; baseClass = UITableViewHeaderFooterView; frame = (0 0; 0 0); text = ''; layer = <CALayer: 0x8a3f860>> at Section 3
2013-11-01 15:16:04.720 FAQDetail[27576:70b] header View <FAQSectionHeaderView: 0x8c70dc0; baseClass = UITableViewHeaderFooterView; frame = (0 0; 0 0); text = ''; layer = <CALayer: 0x8c6f0b0>> at Section 4

ViewController.m で

- (void)viewDidLoad
{
[super viewDidLoad];
[self.tableView registerClass:[FAQSectionHeaderView class] forHeaderFooterViewReuseIdentifier:@"HeaderView"];
[self.tableView registerClass:[FAQDetailCell class] forCellReuseIdentifier:@"Cell"];
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{

FAQSectionHeaderView *headerView = [self.tableView dequeueReusableHeaderFooterViewWithIdentifier:@"HeaderView"];

[headerView setupWithQuestion:[self.sectionTitleArray objectAtIndex:section]];

return headerView;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath      *)indexPath
{
if (self.selectedSection == indexPath.section) {

FAQDetailCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"Cell"];

[cell initWithAnswer:[self.rowsTitleArray objectAtIndex:indexPath.section]];

return cell;
} else
    return nil;

}

FAQSectionHeaderView.m (UITableViewHeaderFooterView のサブクラス) 内

-(void)setupWithQuestion: (NSString *)question{
[self.questionLabel removeFromSuperview];

CGSize expectedLabelHeight = [FAQSectionHeaderView sizeForQuestion:question];

self.questionLabel = [[UILabel alloc] init];

self.questionLabel.frame = CGRectMake(10, 10, self.frame.size.width-20, expectedLabelHeight.height);

NSMutableAttributedString *q = [[NSMutableAttributedString alloc] initWithString:[@"Q " stringByAppendingString:question]];

[q addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, 2)];

[q addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:14] range:NSMakeRange(0, question.length)];


[q addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:17] range:NSMakeRange(0, 2)];

[self.questionLabel setAttributedText:q];

self.questionLabel.font = [UIFont systemFontOfSize:17];

self.questionLabel.numberOfLines = 0;
[self addSubview:self.questionLabel];


self.frame = CGRectMake(0, 0, self.frame.size.width, self.questionLabel.frame.size.height+20);

}

-(void)prepareForReuse{

[self.questionLabel removeFromSuperview];

}

これは、最初とセルの再利用が開始された後の外観です。 ここに画像の説明を入力 ここに画像の説明を入力

4

2 に答える 2

0

どうやら、dequeueReusableHeaderFooterViewWithIdentifier: registerClass:forHeaderFooterViewReuseIdentifier: メソッドを別の場所で呼び出した場合 (呼び出した場合)、常にビューが返されます。

上記のコードに見られる 1 つの問題は、dequeue メソッドからヘッダー ビューを取得した後、カスタム イニシャライザ (つまり、initWithQuestion:) を呼び出すことです。オブジェクトを 2 回初期化しないでください。最初の初期化子は dequeue メソッドによって暗黙的に呼び出されました。つまり、ヘッダー ビューの init メソッドがフレームワークによって呼び出されました。

于 2013-11-01T20:58:30.543 に答える