0

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

我在这里做错了什么?

谢谢

4

2 回答 2

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 也有边距,请考虑所有这些。

于 2011-07-25T12:22:07.863 回答
0

UITextView 需要比您计算的尺寸大一点的空间。因为它有一个上边距和下边距,我不确定那是多少。如果你想要完美贴合,试试

[NSString drawInRect:withFont:]

或者只是为 UITextView 腾出一点空间,你可以通过尝试找到额外的空间。

于 2011-07-25T12:28:09.910 回答