【发布时间】:2013-03-09 20:37:05
【问题描述】:
我想根据标签的高度动态设置单元格的高度。
我创建了单元格:
- (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。 我知道在 cellForRowAtIndexPath 之前调用了 heightForRowAtIndexPath(从日志中可以看出),那么如何更改高度?
【问题讨论】:
-
在对
cellForRowAtIndexPath的调用中未设置单元格的高度。该方法仅返回具有标准高度的单元格。表格获取单元格并将其添加到表格后,将设置单元格的高度。所以在cellForRowAtIndexPath中记录高度是有误导性的。只需确保当单元格的高度最终设置为全高时,您的单元格的自定义内容会正确调整自身。 -
如果你使用下面的,会发生什么? - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return [indexPath row]; }
-
我可以看到里面有一个单元格和分隔符。
-
我只是说如果行没有随着上面的代码逐渐增加,那么他在其他地方有问题。这就是为什么我说“会发生什么?”
-
如果 cellForRowAtIndexPath 中的高度是默认高度,我需要在哪里调整单元格的子视图?在 willDisplayCell 中?
标签: objective-c cocoa-touch uitableview height