web-dev-qa-db-ja.com

iOS 8 sizeThatFits for UITextViewテキストが正しい高さを返さない(AutoLayout)

sizeThatFitsから取得した適切な高さを使用して、UITextViewを垂直方向に中央揃えしようとしています。これがこれを計算する最も適切な方法であることを示唆する他の答えはたくさんあります。

(プレーン文字列と属性文字列の両方で試してみましたが、どちらも同じ動作をすることに注意してください)。

私が何をしようとしても(属性付きの文字列を使用し、フォントサイズまたは行の高さをより大きなまたはより小さなものに設定しても)、常に特定の切り捨てられた文字数(この場合は3行)のみが表示され、常にまったく同じです)。何が足りないのですか?

_textView.text = [_collectionDescription lowercaseString];
_textView.font = [UIFont fontLight:22];
_textView.textColor = [UIColor whiteColor];
_textView.textAlignment = NSTextAlignmentCenter;
_constraintTextViewHeight.constant = ceilf([_textView sizeThatFits:CGSizeMake(_textView.frame.size.width, FLT_MAX)].height);

[_textView setNeedsDisplay];
[_textView updateConstraints];
9
brandonscript

AutoLayoutの場合と同様に、次のことを行う必要があります。

[_textInfoView layoutIfNeeded];

setNeedsDisplayもまったく必要ありません)。

したがって、完全に機能します。

_textView.text = [_collectionDescription lowercaseString];
_textView.font = [UIFont fontLight:22];
_textView.textColor = [UIColor whiteColor];
_textView.textAlignment = NSTextAlignmentCenter;
_constraintTextViewHeight.constant = ceilf([_textView sizeThatFits:CGSizeMake(_textView.frame.size.width, FLT_MAX)].height);

[_textView layoutIfNeeded];
[_textView updateConstraints];
16
brandonscript

sizeThatFits:メソッドを使用する代わりに、次のメソッドを使用できます。これを試すことができます。

NSDictionary *attributes = @{NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:14]};
// NSString class method: boundingRectWithSize:options:attributes:context is
// available only on ios7.0 sdk.
NSString *text = _textView.text;
CGRect rect = [text boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX)
                                 options:NSStringDrawingUsesLineFragmentOrigin
                              attributes:attributes
                                 context:nil];
_constraintTextViewHeight.constant = CGRectGetHeight(rect)

このメソッドは、文字列textの改行も考慮します。

1
Udit Agarwal