用于 UITextView 文本的 iOS 8 sizeThatFits 未返回正确的高度(自动布局)

Posted

技术标签:

【中文标题】用于 UITextView 文本的 iOS 8 sizeThatFits 未返回正确的高度(自动布局)【英文标题】:iOS 8 sizeThatFits for UITextView text not returning correct height (AutoLayout) 【发布时间】:2014-11-20 23:48:33 【问题描述】:

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

【问题讨论】:

您有没有找到有效的答案?无论文本大小如何,我都在疯狂地让 sizeThatFits 始终如一地工作。有时它会在底部留下额外的空间(不舒适),有时会有额外的空间但缺少最后一行文本。有什么事吗? 请看下面的答案 ;) sizeThatFits:ios 8 中已弃用 不,sizeThatFits: 在 iOS 8 中的 UIView 中不被弃用。Link 【参考方案1】:

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

【讨论】:

使用Auto Layout时,只要调用[_textView setNeedsUpdateConstraints],就会通过更新约束触发布局。使用手动布局时,调用[_textView setNeedsLayout]即可,无需调用layoutIfNeeded,会自动完成。【参考方案2】:

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

【讨论】:

NSDictionary *attributes = @NSFontAttributeName: textView.font;会更好:) boundingRectWithSize 也没有返回准确的数字。所以我宁愿避免这种解决方案 我使用 sizeThatFits: 和 boundingRectWithSize: 得到了相同的结果。它们都返回错误的结果。

以上是关于用于 UITextView 文本的 iOS 8 sizeThatFits 未返回正确的高度(自动布局)的主要内容,如果未能解决你的问题,请参考以下文章

ios 8 UITextView UIDataDetectorTypeLink 不起作用

UITextView - 在 XCode 5 上设置字体不适用于 iOS 6

UITextView - 在 XCode 5 上设置字体不适用于 iOS 6

iOS 在UITextView中查找某个Range所在的Rect

iOS-UITextView-文本输入视图的使用

滚动视图中的 UITextView 与 Autolayout iOS 不工作