我有一个UITableViewCell,其子视图由UITextView组成。 textview的内容是动态的,所以我想测量精确的宽度和高度来创建一个单元格和一个textview而不需要滚动。
我创建了以下方法来测量NSString占用的大小:
- (CGSize)getSizeOfString:(NSString *)str font:(NSString *)theFont fontSize:(CGFloat)theSize {
CGSize maxSize = CGSizeMake(280, CGFLOAT_MAX);
UIFont *font = [UIFont fontWithName:theFont size:theSize];
return [str sizeWithFont:font constrainedToSize:maxSize lineBreakMode:UILineBreakModeWordWrap];
}
我正在以这种方式使用它:
// CellForRowAtIndexPath
.....
CGSize size = [strTool getSizeOfString:text font:TEXT_FONT fontSize:TEXT_SIZE];
CGFloat width = size.width;
CGFloat height = size.height;
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(15, 10, width, height)];
[textView setBackgroundColor:[UIColor blueColor]];
textView.font = [UIFont fontWithName:TEXT_FONT size:TEXT_SIZE];
textView.editable = NO;
// Set value
textView.text = text;
[cell.contentView addSubview:textView];
[textView release];
return cell;
// heightForRowAtIndexPath
NSString *returnStr;
if (indexPath.section == SECTION_SHORT)
returnStr = self.manchet;
else
returnStr = self.newsText;
return [strTool getSizeOfString:returnStr font:TEXT_FONT fontSize:TEXT_SIZE].height;
但无论计算出的高度太小,都会导致cellView内部出现令人讨厌的滚动。值得一提的是,几乎所有文本都包含换行符(\ n)。
我在这里做错了什么?
由于
答案 0 :(得分:0)
我认为你的** heightForRowAtIndexPath **应该是这样的:
NSString *returnStr;
if (indexPath.section == SECTION_SHORT) returnStr = self.manchet;
else returnStr = self.newsText;
return [strTool getSizeOfString:returnStr font:TEXT_FONT
fontSize:TEXT_SIZE].height+10.0f*2.0f;
此外,你应该考虑你沿X的文本字段15px的偏移(这意味着sizeWithFont的宽度应该在15px上更小)和从顶部10px,我建议使用相同的底部值使其看起来居中
contentView也有边距,考虑到所有这些。
答案 1 :(得分:0)
UITextView需要比您计算的大小更大的空间。因为它有一个上边距和下边距,我不知道这是多少。如果你想要完美契合,试试
[NSString drawInRect:withFont:]
或者只是为UITextView腾出更多空间,你可以通过尝试找到额外的空间。