iOS7 UITextView contentsize.height替代方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS7 UITextView contentsize.height替代方案相关的知识,希望对你有一定的参考价值。

我正在将一个应用程序从ios 6.1移植到iOS 7.我正在使用一个布局,其中有一个具有固定宽度的UITextView,但它的高度基于其内容。对于iOS 6.1,检查contentsize.height并将其设置为textview的帧高度就足够了,但它在iOS 7上不起作用。

然后,我怎么能创建一个固定宽度的UITextView,但动态高度基于它显示的文本?

注意:我是从代码创建这些视图,而不是使用Interface Builder。

答案

使用以下代码,您可以根据固定宽度更改UITextView的高度(它适用于iOS 7和以前的版本):

- (CGFloat)textViewHeightForAttributedText:(NSAttributedString *)text andWidth:(CGFloat)width
{
    UITextView *textView = [[UITextView alloc] init];
    [textView setAttributedText:text];
    CGSize size = [textView sizeThatFits:CGSizeMake(width, FLT_MAX)];
    return size.height;
}

使用此函数,您将获取NSAttributedString和固定宽度以返回所需的高度。

如果要从具有特定字体的文本计算帧,则需要使用以下代码:

- (CGSize)text:(NSString *)text sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
{
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
    {
        CGRect frame = [text boundingRectWithSize:size
                                          options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
                                       attributes:@{NSFontAttributeName:font}
                                          context:nil];
        return frame.size;
    }
    else
    {
        return [text sizeWithFont:font constrainedToSize:size];
    }
}

您可以在项目的prefix.pch文件中添加SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO,如下所示:

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

您还可以通过以下方式替换以前的测试SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)

if ([text respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)])‌
另一答案

这适用于iOS6和7:

CGSize textViewSize = [self.myTextView sizeThatFits:CGSizeMake(self.myTextView.frame.size.width, FLT_MAX)];
    self.myTextView.height = textViewSize.height;
另一答案

在iOS7中,UITextView使用NSLayoutManager来布局文本:

// If YES, then the layout manager may perform glyph generation and layout for a given portion of the text, without having glyphs or layout for preceding portions.  The default is NO.  Turning this setting on will significantly alter which portions of the text will have glyph generation or layout performed when a given generation-causing method is invoked.  It also gives significant performance benefits, especially for large documents.
@property(NS_NONATOMIC_IOSONLY) BOOL allowsNonContiguousLayout;

禁用allowsNonContiguousLayout来修复contentSize

textView.layoutManager.allowsNonContiguousLayout = NO;
另一答案

使用这个小功能

-(CGSize) getContentSize:(UITextView*) myTextView{
    return [myTextView sizeThatFits:CGSizeMake(myTextView.frame.size.width, FLT_MAX)];
}
另一答案

我的最终解决方案基于HotJard,但包括文本容器的顶部和底部插入,而不是使用2 * fabs(textView.contentInset.top):

- (CGFloat)textViewHeight:(UITextView *)textView
{
    return ceilf([textView.layoutManager usedRectForTextContainer:textView.textContainer].size.height +
                 textView.textContainerInset.top +
                 textView.textContainerInset.bottom);
}
另一答案

使用此方法有更简单的解决方案:

+(void)adjustTextViewHeightToContent:(UITextView *)textView;
{
    if([[UIDevice currentDevice].systemVersion floatValue] >= 7.0f){
        textView.height = [textView.layoutManager usedRectForTextContainer:textView.textContainer].size.height+2*fabs(textView.contentInset.top);
    }else{
        textView.height = textView.contentSize.height;
    }
}

UPD:仅用于显示文本(isEditable = NO)

另一答案
   _textView.textContainerInset = UIEdgeInsetsZero;
   _textView.textContainer.lineFragmentPadding = 0;

只是不要忘记lineFragmentPadding

另一答案

简单的解决方案 - textView.isScrollEnabled = false在另一个滚动视图内部工作时非常完美,或者在UITableViewAutomaticDimension中使用tableView单元格

另一答案

@ Ana's,@ Blake Hamilton的快速解决方案。

var contentHeight: CGFloat = textView.sizeThatFits(textView.frame.size).height

对我来说好处是,当contentSize设置为false时,这也会返回正确的isScrollEnable。设置为false返回文本视图的帧大小而不是内容大小。

以上是关于iOS7 UITextView contentsize.height替代方案的主要内容,如果未能解决你的问题,请参考以下文章

iOS7 UITextView contentsize.height替代方案

在 iOS7 中滚动 UITableView

如何使用自定义 NSTextStorage 清除 UITextView? [仅限 iOS7]

UITextView setContentOffset with scrollEnabled=NO 在 iOS7

iOS 7 UITextView 的原生链接不会取消触摸

iOS 7 UITextView 错误