2015-11-11 12 views
5

次のコードを使用してUITextViewの高さを動的に更新しようとしていますが、結果が一定の数ピクセルずれているため、テキストビューは折り返されますが、別の文字(または2つ)が入力されると、ディスプレイは適切に更新されます。UITextViewをboundingRectWithSizeでラップする:

私はさまざまな投稿を見てきました(廃止されたsizeThatFitsを参照しているため、多くは古くなっています)。 boundingRectWithSize使用してこれらの:(NSStringのかNSAttributedStringどちらか - 私は両方を試してみたその)は次のようになります:インセット:

CGRect boundingRect = [string boundingRectWithSize: CGSizeMake(CGRectGetWidth(textView.frame), CGFLOAT_MAX) 
              options: NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading 
             attributes: @{ 
                 NSFontAttributeName : textView.font 
                 } 
              context: NULL]; 
float h = ceil(CGRectGetHeight(boundingRect)); 

textViewHeightLayoutConstraint.constant = h; 

を私はあなたが言おうとしている最初の事は知っています。ここに私のセットアップコードがあります:

textView.textContainerInset = UIEdgeInsetsZero; 
textView.contentInset = UIEdgeInsetsZero; 
textView.layoutMargins = UIEdgeInsetsZero; 

別のインセット設定ですか?

サイドノート:MuseoSansをフォントとして使用しています。

ハックソリューション

私は幅が閾値の範囲内にあるかどうかをチェックすることにより問題(テストから現在9px)を「固定」し、それがある場合、余分なラインがとても似追加されたことをふりをしました:

float fontHeight = ceil([@"lp" sizeWithAttributes: @{ 
                NSFontAttributeName : textView.font 
                }].height); 


if ((CGRectGetWidth(textView.frame) - ceil(CGRectGetWidth(boundingRect))) <= 9.f) 
    h += fontHeight; 

上記のことで、可能な限り高さをキャプチャし、テキストビューで高さを強制できます。テキストビューは適切に折り返し、次の行にテキストを表示します。

アイデア?

小さなアップデート

効果なしでこれを追加しました:

NSMutableParagraphStyle *paragraphStyle = [NSParagraphStyle.defaultParagraphStyle mutableCopy]; 
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping; 

CGRect boundingRect = [string boundingRectWithSize: CGSizeMake(CGRectGetWidth(textView.frame), CGFLOAT_MAX) 
              options: NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading 
             attributes: @{ 
                 NSFontAttributeName : textView.font, 
                 NSParagraphStyleAttributeName : paragraphStyle 
                 } 
              context: NULL]; 

答えて

7

私は答えを見つけました。それは次のとおりです。

textView.textContainer.lineFragmentPadding 

私はtextViewの幅からそれを差し引く必要がありました。私は、3セットのインセットとマージンに加えて、パディングのもう一つのソースがあると思います。

関連する問題