无法动态正确获取UITextView高度

9
我在获取uitextview的正确大小方面遇到了问题。在我的应用程序中,我从webservice获取数据,并根据webservice中的数据设置uitextview的高度。但是,每当前35个字母中有空格时(我的textview框架为(20,0,255,2000)),计算出来的高度总是比正确的高度少一行,即使uitextview开始在新行中打印空格后的单词(可能是因为单词太长了?)。 因此,我得到了错误的textview高度。
文本视图如下所示:
第一个单词 空格空格空格空格 空格空格空格空格 空格空格空格空格 空格空格空格空格 空格空格空格空格
当我输入没有空格的文本时,它会给我正确的高度。例如:数据是“ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt”,那么在上述情况下,Cgsize将为我生成正确的结果。
我不使用UILabel是因为我想要链接检测。如果有其他建议,欢迎提出。
谢谢。 Mrugen
6个回答

34

使用NSString的sizeWithFont方法无法很好地适用于文本视图。它对于UILabel效果很好,但是文本视图似乎在文本周围有额外的填充。如果您使用该方法,则最终得到的尺寸会稍短。

UITextView是UIScrollView的子类。在设置文本视图的文本属性后,其contentSize属性会自动更新以适应文本。因此,如果您想将文本视图的高度设置为适合其文本,请执行以下操作:

textView.text    = @"some text";
CGRect rect      = textView.frame;
rect.size.height = textView.contentSize.height;
textView.frame   = rect;

这将设置您的textView的高度,使其包含文本。


2
@ Charlie,除此之外,我们还需要设置TextView的setFitToSize属性,这对我很有帮助。谢谢。 - mrugen munshi
不确定在哪里找到setFitToSize方法,仅仅设置textView的文本并使用内容大小更新高度并没有改变高度。 - user441669

9
您可以使用此函数测量文本的高度,并根据返回的高度设置您的框架。
   -(CGSize)sizeOfText:(NSString *)textToMesure widthOfTextView:(CGFloat)width withFont:(UIFont*)font
    {
        CGSize ts = [textToMesure sizeWithFont:font constrainedToSize:CGSizeMake(width-20.0, FLT_MAX) lineBreakMode:UILineBreakModeWordWrap];
        return ts; 
    }

你可以这样使用它:
 CGSize size =   [self sizeOfText:@"the string you want to present" widthOfTextView:255 withFont:fontYouAreUsing];

然后将其传递给文本视图:
   textView.frame = CGRectMake(20,0,255,size.height);

祝你好运

shani


3
iOS 7 中 textView 的 contentSize 不起作用,需要你的解决方案。但是 xCode 提示 sizeWithFont 已经被弃用了。请问您现在有什么建议?我需要您的帮助,谢谢。 - Elyas Naranjee Sani
CGRect textRect = [textToMesure boundingRectWithSize:CGSizeMake(width, FLT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil]; CGSize size = textRect.size;CGRect textRect = [textToMesure boundingRectWithSize:CGSizeMake(width, FLT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil]; CGSize size = textRect.size; - Alberto Lopez

1
从iOS7开始,您现在应该使用:
CGRect textRect = [textToMesure boundingRectWithSize:CGSizeMake(width, FLT_MAX)
                                     options:NSStringDrawingUsesLineFragmentOrigin
                                  attributes:@{NSFontAttributeName:font}
                                     context:nil];

CGSize size = textRect.size;

0

获取任何 textField 的估计高度和宽度:(Swift 4)

它以 TextField 的文本作为参数。

private func estimateFrameForText(text: String) -> CGRect {

        let size = CGSize(width: 200.0, height: 1000)

        let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)

        return NSString(string: text).boundingRect(with: size, options: options, attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 17.0)], context: nil)
    }

0
您的问题的答案是:创建UITextView的实例,我这里创建了一个名为txtView的实例,然后向其添加文本并在控制台中打印内容高度。

NSLog(@"TextView 高度为:%d", txtView.contentSize.height)


1
这可能是我听过的最不灵活的方法。 - katzenhut
@katzenhut 如果你只是在代码中使用 UITextView 而不显示它,那么它可能会浪费宝贵的资源 :))))) 无论如何,这都是一种浪费。 - 0xKayvan

0

在Swift 4中尝试过,

textView.intrinsicContentSize.height


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接