如果要包装的文本中有一个长字符串,sizeWithFont不会为UITextView提供正确的高度

15 iphone objective-c nsstring uitextfield

有没有办法使用以下方法获得正确的NSString大小:

- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode
Run Code Online (Sandbox Code Playgroud)

不会被2或300个字符串抛出.目前,如果我尝试在这些长字符串上使用此方法,则会错误地计算它们,并且最终会在UITextView的底部显示大量空格.

我尝试过使用UILineBreakModeWordWrap和UILineBreakModeCharacterWrap.

调整大小正在进行中

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGFloat     result = 44.0f;
    NSString*   text = nil;
    CGFloat     width = 0;
    CGFloat     tableViewWidth;
    CGRect      bounds = [UIScreen mainScreen].bounds;

    tableViewWidth = bounds.size.width;


    width = tableViewWidth - 150;       

    text = stringWithLongWords;

    if (text) {
        CGSize      textSize = { width, 20000.0f };     
        CGSize      size = [text sizeWithFont:[UIFont systemFontOfSize:10.0f] constrainedToSize:textSize lineBreakMode:UILineBreakModeWordWrap];

        size.height += 50.0f;               
        result = MAX(size.height, 44.0f+30.0f); 
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*uri 21

UITextView并不完全像一个UILabel包裹在一个UIScrollView.它的行间距不同于sizeWithFont:constrainedToSize:linkBreakMode:不考虑的字体大小和边距.

了解字体大小后,您可以计算行数并考虑行间距.你可以猜测边缘并尝试欺骗sizeWithFont:以提供更有用的答案.

流行的解决方案似乎是:

  • UILabel如果您不需要任何UITextView功能,请使用a

  • 如果你需要hyperlinks,覆盖UIButtons看起来像超链接UILabel

  • 使用屏幕外UITextViewsizeToFit方法来获得真正的答案

我没有运气第三选项,但听起来应该有效,所以也许我做错了.

我将尝试使用UILabel和覆盖按钮的超链接.我们会看到结果如何.

如果失败了,Loren Brichter(Tweetie成名)总会选择:将所有东西都用到UIView自己身上CoreGraphics.

祝好运!

  • 第三个选项可能无法正常工作,因为在UITextView呈现到屏幕之前,sizeToFit将无法工作.只是一个想法. (2认同)

her*_*son 9

看看这篇文章如何调整UITextView的内容?

看起来像textView.contentSize.height应该工作(需要注意的是,只有在使用addSubview将UITextView添加到视图后才能使用正确的contentSize)


nev*_*ing 1

你说你们有一个UITableView不同身高的人。您是否将所有单元格的重用标识符设置为相同的值?可能会重复使用已设置高度的旧单元格。如果这是问题所在,您应该在重复使用单元格时再次调整单元格的大小。