如何调整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
并将其约束到两侧 UITextView
的scrollEnabled
属性设置为NO
。 启用滚动功能后, UITextView
的框架与内容大小无关,但禁用滚动功能时,两者之间存在关系。 如果您的表格使用44的原始默认行高,那么它将自动计算行高,但如果您将默认行高更改为其他值,则可能需要手动打开viewDidLoad
中行高的自动计算:
tableView.estimatedRowHeight = 150;
tableView.rowHeight = UITableViewAutomaticDimension;
对于只读动态调整UITextView
的大小,就是这样。 如果您允许用户编辑UITextView
的文本,则还需要:
实现UITextViewDelegate
协议的textViewDidChange:
方法,并在每次编辑文本时告诉tableView
自己重绘:
- (void)textViewDidChange:(UITextView *)textView;
{
[tableView beginUpdates];
[tableView endUpdates];
}
不要忘记在Storyboard
或tableView:cellForRowAtIndexPath:
设置UITextView
委托tableView:cellForRowAtIndexPath: