如何根据内容调整 UITextView 的大小,宽度固定

Posted

技术标签:

【中文标题】如何根据内容调整 UITextView 的大小,宽度固定【英文标题】:How to resize a UITextView according to the content, with fixed width 【发布时间】:2013-11-13 01:33:37 【问题描述】:

我必须以编程方式创建一个 UITextView,但在设置它的大小时遇到​​了一些麻烦。

假设我有一个句子,多行:

s = @"Hello World\nHello World\nHello World\n";

现在我想弄清楚我需要显示它的高度,并相应地设置我的 UITextView 的高度(需要固定宽度)。以下是我的代码:

    CGSize size = [text sizeWithFont:_FONT_MYRIADPRO(20.0f) constrainedToSize:CGSizeMake(300, 1000)];
    
    _textBox.text = text;
    _textBox.frame = CGRectMake(10, 10, 300, size.height);
    _textBox.font = _FONT_MYRIADPRO(20.0f);
    _textBox.textColor = _COLOR_BLACK;
    _textBox.backgroundColor = _COLOR_BLUE_DARK;

    self.frame = CGRectMake(0, 0, 320, _textBox.frame.size.height + 2 * 10);

     [self addSubview:_textBox];

但是,结果是这样的:

我尝试了很多其他方法,比如调用

[_textBox sizeToFit]

这也失败了,因为我想修复宽度。

我也试过

    NSAttributedString *titleText = [[NSAttributedString alloc] initWithString:text attributes:@NSFontAttributeName: _FONT_MYRIADPRO(20.0f)];
    CGRect bound = [titleText boundingRectWithSize:CGSizeMake(300, 1000) options:NSStringDrawingUsesLineFragmentOrigin context:nil];
        
    _textBox.text = text;
    _textBox.frame = CGRectMake(10, 10, 300, bound.size.height);

同样失败,结果和上图一样。

谁能帮帮我?

【问题讨论】:

现在你只想根据字符串长度固定宽度? 你使用sizeToFit后是否尝试过固定宽度? @Chancy 我想动态加载文本,保持 UITextView 的宽度固定。因此我需要根据正在加载的文本来调整它的高度 为什么sizeToFit不适合你? 现在高度合适了吗?只有宽度不适合你? 【参考方案1】:

我为这个案例做了一些测试。我认为我们最好为高度添加下降器和前导。下行和前导的具体含义请参考https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/Introduction/Introduction.html

我的示例代码如下:

//
//  RootViewController.m
//  TextViewSize
//
//  Created by AnkyHe on 11/13/13.
//  Copyright (c) 2013 Gery Studio. All rights reserved.
//
#import <QuartzCore/QuartzCore.h>

#import "RootViewController.h"

#define TextFont ([UIFont systemFontOfSize:20.0f])

static NSString *textContent = nil;
static NSUInteger const LineNum = 10;

@interface RootViewController ()

@property (nonatomic, weak)  UITextView *textView;

@end

@implementation RootViewController

- (void)viewDidLoad

    [super viewDidLoad];
  // Do any additional setup after loading the view.

    NSMutableArray *lines = [[NSMutableArray alloc] initWithCapacity:LineNum];
    for (int i = 0; i < LineNum; ++i) 
        [lines addObject:[NSString stringWithFormat:@"%d Hello world", i]];
    

    textContent = [lines componentsJoinedByString:@"\n"];

    self.view.backgroundColor = [UIColor whiteColor];

    UITextView *textView = [[UITextView alloc] init];
    self.textView = textView;
    self.textView.text = textContent;
    self.textView.font = TextFont;
    [self.view addSubview:self.textView];


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


- (void)viewDidLayoutSubviews

    [super viewDidLayoutSubviews];

    CGRect textRect = [textContent boundingRectWithSize:CGSizeMake(300, 1000)
                                                options:NSStringDrawingUsesLineFragmentOrigin
                                             attributes:@NSFontAttributeName:TextFont
                                                context:nil];

    CGSize size = textRect.size;
    self.textView.frame = CGRectMake(0, 0, 300, size.height + TextFont.descender + TextFont.leading);
    self.textView.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds));


@end

输出如下:

【讨论】:

你试过其他文字吗?喜欢 10 行的“Hello World”吗?似乎问题仍然存在。我原来的方法在UILabel上效果很好,现在发现在UITextView中,每一行之后,都会多出一个4pt,这不是像[boundingRectWithSize]这样的NSString的方法计算出来的……你知道这个额外的4pt是什么吗?是? 我测试了 10 行,还是可以的。请阅读我修改后的代码。

以上是关于如何根据内容调整 UITextView 的大小,宽度固定的主要内容,如果未能解决你的问题,请参考以下文章

如何根据内容调整 UITextView 的大小,宽度固定

表视图内的 UITextView 未根据内容调整大小

如何根据 UITextView 动态调整 xib 的大小

基于 UITextView 动态调整 CGRect 的大小

根据内容字体大小动态调整 UIWebView 的大小

在 UIScrollView 中自动调整 UITextView 的大小