如何调整UITextView的内容大小?
有没有一种很好的方法来调整UITextView的大小以符合其内容?假设我有一个包含一行文本的UITextView
:
"Hello world"
然后添加另一行文本:
"Goodbye world"
在Cocoa Touch中,有没有一种好的方法来获取将在文本视图中保留所有行的" rect",以便我可以相应地调整父视图?
作为另一个示例,请在"日历"应用程序注释中查看事件的"注释"字段,该单元格(及其包含的" UITextView")如何扩展以容纳注释字符串中所有文本行。
解决方案
回答
我们尝试过[texttext sizeThatFits:textView.bounds]吗?
编辑:sizeThatFits返回大小,但实际上不调整组件的大小。我不确定这是否是我们想要的东西,还是[textView sizeToFit]`还是我们想要的东西。无论哪种情况,我都不知道它是否完全适合我们想要的内容,但这是尝试的第一件事。
回答
另一个方法是使用NSString方法查找特定字符串将占用的大小:
-((CGSize)sizeWithFont:(UIFont *)fontconstrainedToSize:(CGSize)size
这将返回适合给定字符串和给定字体的矩形的大小。输入具有所需宽度和最大高度的大小,然后我们可以查看返回的高度以适合文本。有一个版本可以让我们指定换行模式。
然后,我们可以使用返回的大小来更改视图的大小以适合。
回答
结合Mike McMaster的答案,我们可能想要执行以下操作:
[myTextView setDelegate: self]; ... - (void)textViewDidChange:(UITextView *)textView { if (myTextView == textView) { // it changed. Do resizing here. } }
回答
以我(有限)的经验,
- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode
不尊重换行符,因此我们最终得到的`CGSize'比实际所需的要短得多。
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
似乎确实尊重换行符。
另外,文本实际上并没有呈现在UITextView的顶部。在我的代码中,我将UITextView的新高度设置为比sizeOfFont方法返回的高度大24像素。
回答
希望这可以帮助:
- (void)textViewDidChange:(UITextView *)textView { CGSize textSize = textview.contentSize; if (textSize != textView.frame.size) textView.frame.size = textSize; }
回答
这在iOS 7或者更高版本上不再有效
实际上,有一种非常简单的方法可以将UITextView的大小调整为正确的内容高度。可以使用UITextViewcontentSize
来完成。
CGRect frame = _textView.frame; frame.size.height = _textView.contentSize.height; _textView.frame = frame;
需要注意的一件事是,只有在将UITextView添加到带有addSubview的视图中之后,正确的contentSize才可用。在此之前,它等于frame.size
如果自动版面设置为ON,则此功能将不起作用。使用自动布局时,通常的方法是使用" sizeThatFits"方法并根据高度限制更新" constant"值。
CGSize sizeThatShouldFitTheContent = [_textView sizeThatFits:_textView.frame.size]; heightConstraint.constant = sizeThatShouldFitTheContent.height;
" heightConstraint"是一种布局约束,通常可以通过将属性链接到在情节提要中创建的高度约束,通过IBOutlet进行设置。
如果要添加一个令人惊讶的答案,2014年,如果我们:
[self.textView sizeToFit];
仅iPhone6 +的行为有所不同:
仅使用6+(而不是5s或者6),它确实向UITextView添加了"多一个空白行"。 " RL解决方案"可完美解决此问题:
CGRect _f = self.mainPostText.frame; _f.size.height = self.mainPostText.contentSize.height; self.mainPostText.frame = _f;
它解决了6岁以上的"额外排队"问题。