我正在尝试使用看起来像消息的单元格的视图控制器。 在cellForRowAtIndexPath方法中,我获取文本并使用以下代码进行测量:
NSStringDrawingContext *ctx = [NSStringDrawingContext new];
NSAttributedString *aString = [[NSAttributedString alloc] initWithString:message.text];
UITextView *calculationView = [[UITextView alloc] init];
[calculationView setAttributedText:aString];
CGRect textRect = [calculationView.text boundingRectWithSize:self.view.frame.size options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:calculationView.font} context:ctx];
cell.messageLabel.frame = CGRectMake(20, 20, MIN(textRect.size.width + 20, 240), textRect.size.height + 10);
此代码还会更改标签的大小和位置。 但问题是标签的大小在视图加载后仅变化一秒,而在视图加载时不会立即变化。 有谁知道为什么会这样?
答案 0 :(得分:0)
实施tableView:heightForRowAtIndexPath:
方法。 cellForRowAtIndexPath
方法不是您应该进行高度计算的地方。
#define FONT_SIZE 14.0f
#define CELL_CONTENT_WIDTH 320.0f
#define CELL_CONTENT_MARGIN 10.0f
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
NSString *text = [DescArr objectAtIndex:[indexPath row]];
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
CGFloat height = MAX(size.height, 100.0);
return height;
}