2012-08-09 113 views
2

此問題已被多次詢問,但重複給出的兩個或三個答案似乎不起作用。UITextView調整寬度以適應文本

問題是:一個包含一些任意文本的UITextView。在做了一些動作之後,UITextView需要在水平和垂直方向調整大小以適合文本。

對其他問題的回答給出的值看起來大約與文本的寬度/高度相同;但是,當UITextView被調整爲計算大小時,它不是很正確,並且文本行分裂與原來的不同。

推薦方法包括使用– sizeWithFont:constrainedToSize:和其他的NSString方法中,UITextView的(這給出了更正確的高度,但是視圖的全寬)的sizeThatFits:方法,文本視圖的contentSize屬性(還給出了錯誤的寬度)。

是否有準確的方法來確定UITextView的文本的寬度?或者是在文本視圖中有一些隱藏的填充,使文本適合的實際寬度更小?還是別的我完全失蹤?

+0

出於好奇,如果使用sizeWithFont方法,結果有多遠? UITextView * textView = [[UITextView alloc] initWithFrame:CGRectMake(20,20,300,200)]; textView.font = [UIFont systemFontOfSize:10.0f]; (textView.contentInset.left + textView.contentInset.left),MAXFLOAT)lineBreakMode:UILineBreakModeWordWrap] [size = -1] CGSize textViewSize = [textView.text sizeWithFont:[UIFont systemFontOfSize:10.0f] constrainedToSize:CGSizeMake(textView.frame.size.width - (textView.contentInset.left + textView.contentInset.left) ; – 2012-08-09 23:30:38

+0

很難說完全是因爲我沒有正確的編號來比較它。內容插入全部爲零。 sizeWithFont返回的大小太小,因此會增加額外的分數。如果我增加了設置文本視圖的寬度[textView.text sizeWithFont:font constrainedToSize:textView.frame.size] + fudge,十六個一致似乎是給出正確大小的幻數。如果文本在一個詞的中間而不是在一個空格處打破,那不起作用。在這種情況下,sizeWithFont是正確的。 – 2012-08-10 13:30:12

+0

也許空間字符不被sizeWithFont考慮,但會影響每條線如何適合uiTextView? – 2012-08-10 13:30:56

回答

0

我注意到同樣的問題:NSString上的- sizeWithFont:constrainedToSize:將使用不同的換行符,而不是相同寬度的UITextView。

這是我的解決方案,但我希望找到更清潔的東西。

UITextView *tv = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, myMaxWidth, 100)]; // height resized later. 
    tv.font = myFont; 
    tv.text = @"."; // First find the min height if there is only one line. 
    [tv sizeToFit]; 
    CGFloat minHeight = tv.contentSize.height; 
    tv.text = myText; // Set the real text 
    [tv sizeToFit]; 
    CGRect frame = tv.frame; 
    frame.size.height = tv.contentSize.height; 
    tv.frame = frame; 
    CGFloat properHeight = tv.contentSize.height; 
    if (properHeight > minHeight) { // > one line 
     while (properHeight == tv.contentSize.height) { 
      // Reduce width until height increases because more lines are needed 
      frame = tv.frame; 
      frame.size.width -= 1; 
      tv.frame = frame; 
     } 
     // Add back the last point. 
     frame = tv.frame; 
     frame.size.width += 1; 
     tv.frame = frame; 
    } 
    else { // single line: ask NSString + fudge. 
     // This is needed because a very short string will never break 
     // into two lines. 
     CGSize tsz = [myText sizeWithFont:myFont constrainedToSize:tv.frame.size]; 
     frame = tv.frame; 
     frame.size.width = tsz.width + 18; // YMMV 
     tv.frame = frame; 
    } 
相關問題