用于UITextView文本的iOS 8 sizeThatFits未返回正确的高度(AutoLayout)

时间:2014-11-20 23:48:34

标签: ios objective-c autolayout uitextview nslayoutconstraint

我正在尝试使用从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];

2 个答案:

答案 0 :(得分:16)

与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];

答案 1 :(得分:1)

您可以使用以下方法,而不是使用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

中的换行符