使用sizeWithFont计算NSString大小时的错误计算:constraintedToSIze:lineBreakMode

时间:2011-07-25 11:40:34

标签: iphone nsstring sizewithfont

我有一个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)。

我在这里做错了什么?

由于

2 个答案:

答案 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腾出更多空间,你可以通过尝试找到额外的空间。