如何调整UITextView的内容大小?

有没有一种好方法来调整UITextView的大小以符合其内容? 比如说我有一个包含一行文本的UITextView

"Hello world"

然后我添加另一行文字:

"Goodbye world"

在Cocoa Touch中有一个很好的方法来获取将保留文本视图中所有行的rect ,以便我可以相应地调整父视图?

作为另一个例子,查看日历应用程序中事件的注释字段 - 注意单元格(以及它包含的UITextView )如何扩展以保存注释字符串中的所有文本行。


这适用于iOS 6.1和iOS 7:

- (void)textViewDidChange:(UITextView *)textView
{
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    textView.frame = newFrame;
}

或者在Swift中

let fixedWidth = textView.frame.size.width
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
textView.frame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)

如果你想要支持iOS 6.1,那么你还应该:

textview.scrollEnabled = NO;

这不再适用于iOS 7或更高版本

实际上有一种非常简单的方法可以将UITextView大小调整为正确的内容高度。 它可以使用UITextView contentSize

CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

需要注意的一点是,正确的contentSize UITextView通过addSubview添加到视图后才可用。 在此之前它等于frame.size

如果自动布局为ON,这将不起作用。 对于自动布局,一般的方法是使用sizeThatFits方法并在高度约束上更新constant量值。

CGSize sizeThatShouldFitTheContent = [_textView sizeThatFits:_textView.frame.size];
heightConstraint.constant = sizeThatShouldFitTheContent.height;

heightConstraint是您通常通过将属性链接到故事板中创建的高度约束来通过IBOutlet设置的布局约束。


为了增加这个惊人的答案,2014年,如果你:

[self.textView sizeToFit];

仅与iPhone6 +的行为有所不同:

在这里输入图像描述

仅使用6+(不是5或6),它为UITextView添加了“多一个空行”。 “RL解决方案”完美地解决了这个问题:

CGRect _f = self.mainPostText.frame;
_f.size.height = self.mainPostText.contentSize.height;
self.mainPostText.frame = _f;

它修复了6+以上的“额外线路”问题。


为了在UITableViewCell创建一个动态调整大小的UITextView ,我发现以下组合在iOS 8 SDK中可以在Xcode 6中使用:

  • UITextView添加到UITableViewCell并将其约束到两侧
  • UITextViewscrollEnabled属性设置为NO 。 启用滚动功能后, UITextView的框架与内容大小无关,但禁用滚动功能时,两者之间存在关系。
  • 如果您的表格使用44的原始默认行高,那么它将自动计算行高,但如果您将默认行高更改为其他值,则可能需要手动打开viewDidLoad中行高的自动计算:

    tableView.estimatedRowHeight = 150;
    tableView.rowHeight = UITableViewAutomaticDimension;
    
  • 对于只读动态调整UITextView的大小,就是这样。 如果您允许用户编辑UITextView的文本,则还需要:

  • 实现UITextViewDelegate协议的textViewDidChange:方法,并在每次编辑文本时告诉tableView自己重绘:

    - (void)textViewDidChange:(UITextView *)textView;
    {
        [tableView beginUpdates];
        [tableView endUpdates];
    }
    
  • 不要忘记在StoryboardtableView:cellForRowAtIndexPath:设置UITextView委托tableView:cellForRowAtIndexPath:

  • 链接地址: http://www.djcxy.com/p/65441.html

    上一篇: How do I size a UITextView to its content?

    下一篇: Python module for converting PDF to text