0

ラベルの高さに基づいてセルの高さを動的に設定したい。

セルを作成しました:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *simpleTableIdentifier = @"ORDStepsCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

UILabel *stepsLabel;
UILabel *stepsNumberLabel;
UIImageView *bulletImageView;
UIImageView *cellBackgroungImage;

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:simpleTableIdentifier];

    CGRect stepsLabelFrame = CGRectMake(20, 0, 253, 21);
    CGRect bulletImageViewFrame = CGRectMake(281, 25, 29, 29);;
    CGRect stepsNumberLabelFrame = CGRectMake(3, 3, 21, 21);
    CGRect cellBackgroungImageFrame = CGRectMake(0, 0, 320, 80);

    cellBackgroungImage = [[UIImageView alloc] initWithFrame:cellBackgroungImageFrame];
    cellBackgroungImage.image = [UIImage imageNamed:@"list-item"];

    stepsLabel = [[UILabel alloc] initWithFrame:stepsLabelFrame];
    stepsLabel.textAlignment = UITextAlignmentRight;
    stepsLabel.tag = 0;

    bulletImageView = [[UIImageView alloc] initWithFrame:bulletImageViewFrame];
    bulletImageView.image = [UIImage imageNamed:@"step-bullet"];

    stepsNumberLabel = [[UILabel alloc] initWithFrame:stepsNumberLabelFrame];
    stepsNumberLabel.textAlignment = UITextAlignmentCenter;
    stepsNumberLabel.textColor = [UIColor whiteColor];
    stepsNumberLabel.backgroundColor = [UIColor clearColor];
    stepsNumberLabel.font = [UIFont boldSystemFontOfSize:17.0];
    stepsNumberLabel.tag = 1;

    [cell.contentView addSubview:cellBackgroungImage];
    [cell.contentView addSubview:stepsLabel];
    [cell.contentView addSubview:bulletImageView];
    [bulletImageView addSubview:stepsNumberLabel];

} else {
    stepsLabel = (UILabel *)[cell viewWithTag:0];
    stepsNumberLabel = (UILabel *)[cell viewWithTag:1];
}

stepsLabel.text = [preperationSteps objectAtIndex:indexPath.row];
[stepsLabel setBackgroundColor:[UIColor redColor]];
[stepsLabel setNumberOfLines:0];
[stepsLabel sizeToFit];

NSLog(@"cellHeight = %f", cell.frame.size.height);

stepsLabel.frame = CGRectMake(20, (cell.frame.size.height - stepsLabel.frame.size.height) / 2, 253, stepsLabel.frame.size.height);

stepsNumberLabel.text = [NSString stringWithFormat:@"%d", indexPath.row + 1];

[cell setSelected:NO];
[cell setSelectionStyle:UITableViewCellEditingStyleNone];

return cell;

}

次に、ラベルの高さを計算しました。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
UILabel *cellLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 253, 30)];
NSString *labelText = [preperationSteps objectAtIndex:indexPath.row];
cellLabel.text = labelText;
[cellLabel setNumberOfLines:0];

[cellLabel sizeToFit];

cellLabel.frame = CGRectMake(0, 0, 253, cellLabel.frame.size.height);
CGFloat cellLabelHeight = cellLabel.frame.size.height;
NSLog(@"cellLabelHeight = %f", cellLabelHeight + 20);
return cellLabelHeight + 20;
}

ログ内:

2013-03-08 17:37:18.161 Recipe[37547:c07] cellLabelHeight = 125.000000
2013-03-08 17:37:18.161 Recipe[37547:c07] cellLabelHeight = 62.000000
2013-03-08 17:37:18.161 Recipe[37547:c07] cellLabelHeight = 41.000000
2013-03-08 17:37:18.162 Recipe[37547:c07] cellLabelHeight = 41.000000
2013-03-08 17:37:18.162 Recipe[37547:c07] cellLabelHeight = 41.000000
2013-03-08 17:37:18.162 Recipe[37547:c07] cellLabelHeight = 41.000000
2013-03-08 17:37:18.163 Recipe[37547:c07] cellLabelHeight = 62.000000
2013-03-08 17:39:34.852 Recipe[37581:c07] cellHeight = 44.000000
2013-03-08 17:39:34.852 Recipe[37581:c07] cellHeight = 44.000000
2013-03-08 17:39:34.853 Recipe[37581:c07] cellHeight = 44.000000
2013-03-08 17:39:34.853 Recipe[37581:c07] cellHeight = 44.000000
2013-03-08 17:39:34.854 Recipe[37581:c07] cellHeight = 44.000000
2013-03-08 17:39:34.854 Recipe[37581:c07] cellHeight = 44.000000
2013-03-08 17:39:34.855 Recipe[37581:c07] cellHeight = 44.000000

ご覧のとおり、heightForRowAtIndexPath から返される値が異なっていても、セルの高さは 44 に固定されています。heightForRowAtIndexPath が cellForRowAtIndexPath の前に呼び出されることはわかっています (ログに示されているように)。どうすれば高さを変更できますか?

4

3 に答える 3

1

あなたが譲っている高さheightForRowAtIndexPathは、表示されているものです。このコードをコントローラーに貼り付けて、実際に表示されている高さを確認してください。

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"%f", cell.frame.size.height);
}

ログインしているcellForRowAtIndexPath高さは、セルのデフォルトの高さです。cellForRowAtIndexPath高さは、が呼び出された後に割り当てられます。

于 2013-03-08T16:04:34.633 に答える
0

私にとって問題を解決したのsizeWithFont:constrainedToSize:lineBreakMode: は、cellForRowAtIndexPathおよびメソッドを使用してラベルのテキストの長さを計算し、計算されたサイズを使用しheightForRowAtIndexPathてラベルのフレームを設定することです。 誰にとっても役立つ場合は、コードを投稿します。cellForRowAtIndexPath

于 2013-03-09T12:37:05.907 に答える