iOS7 UITextView contentsize.height替代方案

Zol*_*adi 78 uitextview ios ios7

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

然后,我如何UITextView根据它显示的文本创建一个固定宽度,但动态高度?

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

Jor*_*tel 180

使用以下代码,您可以根据固定宽度更改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;
}
Run Code Online (Sandbox Code Playgroud)

使用此函数,您将获取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];
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO在项目的prefix.pch文件中添加它:

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
Run Code Online (Sandbox Code Playgroud)

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

if ([text respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)])?
Run Code Online (Sandbox Code Playgroud)

  • 也许你应该链接到你从中获取的答案?http://stackoverflow.com/questions/18368567/uitableviewcell-with-uitextview-height-in-ios-7 (16认同)
  • 用iOS7测试过.有用!真棒. (2认同)

Ana*_*na 42

这适用于iOS6和7:

CGSize textViewSize = [self.myTextView sizeThatFits:CGSizeMake(self.myTextView.frame.size.width, FLT_MAX)];
    self.myTextView.height = textViewSize.height;
Run Code Online (Sandbox Code Playgroud)


nov*_*ova 20

在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;
Run Code Online (Sandbox Code Playgroud)

禁用allowsNonContiguousLayout修复contentSize:

textView.layoutManager.allowsNonContiguousLayout = NO;
Run Code Online (Sandbox Code Playgroud)

  • 你的答案不合适,但适合我的问题.所以我投了:) (6认同)

小智 15

使用这个小功能

-(CGSize) getContentSize:(UITextView*) myTextView{
    return [myTextView sizeThatFits:CGSizeMake(myTextView.frame.size.width, FLT_MAX)];
}
Run Code Online (Sandbox Code Playgroud)