如何调整UITextView的内容大小?

时间:2020-03-05 18:49:36  来源:igfitidea点击:

有没有一种很好的方法来调整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岁以上的"额外排队"问题。