2011-05-13 64 views
3

我需要从上到下计算UITextView的高度。我修剪它包含了(所以它只能上升到光标)文本,然后使用的NSString的sizeWithFont:constrainedToSize:lineBreakMode:方法制定出的高度,就像这样:为什么NSString sizeWithFont:返回错误的大小?

NSRange range; 
    range.location = noteTextView.selectedRange.location; 
    range.length = noteTextView.text.length - range.location; 

    NSString *string = [noteTextView.text stringByReplacingCharactersInRange:range withString:@""]; 

    CGSize size = [string sizeWithFont:noteTextView.font 
        constrainedToSize:noteTextView.frame.size 
         lineBreakMode:UILineBreakModeWordWrap]; 

    NSLog(@"height is: %f \n", size.height); 

它做我输入任何东西每次都是这样。

问题是,当我键入NSLog时,它不会记录高度变化,直到我在新行上输入4个字符。这就好像sizeWithFont方法正好是四个字符一样。这里的一对夫妇的截图显示了我的意思: Height with three characters on line Height with four characters on line

谁能告诉我是怎么回事?

+3

问题可能是文本视图在显示文本时在边上有边距,所以它的实际宽度小于textview的帧宽度 – Vladimir 2011-05-13 10:42:49

+0

@Vladimir - 为什么是评论而不是答案?我认为你是绝对正确的,但不能将它作为一个好的答案投票:) – deanWombourne 2011-05-13 10:46:38

+0

你做了很多假设,UITextView完全呈现完成,因为你的计算已经完成了......现在或未来,它可能工作或可能不工作。我猜,@弗拉基米尔已经指出了这个问题。 – Eiko 2011-05-13 10:47:31

回答

6

@ Vladimir的评论是正确的我认为 - NSString没有考虑到UITextField的边距。

您可以尝试获取光标前面的文本并创建仅包含该文本的新UITextField。

然后,如果您在新文本字段中调用[tempTextField sizeToFit],那么它的范围应该是您正在查找的大小。

+0

我刚刚看到弗拉基米尔的评论,我试着计算textView的'contentInset',并从宽度减去它。这样好多了,但并不完美(现在只有一个字符)。我怀疑,正如Eiko所言,我永远无法100%确定我确切知道UITextView将如何呈现,所以我想你的方法是我可以确保准确性的唯一方法... – 2011-05-13 10:56:25

+0

+1:很好的工作 – Jhaliya 2011-05-13 11:07:33

+0

啊 - 一个问题:我使用的是UITextView,而不是UITextField,所以没有sizeToFit方法。希望有一个方法,但是...我会报告回来,如果我找到它。 – 2011-05-13 11:57:47

相关问题