用于 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