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];
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];
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
の改行も考慮します。