11

下面的代码片段在安装 Xcode 5 之前将 UITextView 框架的大小调整为它的内容高度,但它在升级后不起作用:

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

我已经搜索并没有找到修复程序。有什么想法吗?

4

5 回答 5

26

在 iOS 7 上有新的东西。

要获取文本视图在更新其文本后使用的“适合”大小,请调用usedRectForTextContainer:textView 的layoutManager属性,将 textView 的textContainer属性作为参数传递。

关于滚动的警告词:但是,请注意,如果在文本视图上禁用滚动,则在更新文本视图更改文本视图的框架大小可能会出现意外的视觉错误。如果发生这种情况,请在编辑文本视图的文本之前启用滚动,然后在更新后禁用它(如果您需要滚动以保持禁用状态)。

于 2013-09-17T21:08:16.397 回答
14

要在 iOS 7 (Xcode 5) 中工作,只需:

  1. 通过设置给整个空间来接收文本:

    [myTextView setScrollEnabled:YES];

  2. 传递真实文本:

    myTextView.text = theTextVariable;或者myTextView.text = @"The text...";

  3. 自动调整文本视图:

    [myTextView sizeToFit];

  4. 禁用滚动:

    [myTextView setScrollEnabled:NO];

PS:myTextView 也可以用作 self.myTextView 或 _myTextView

玩得开心!

于 2013-11-21T13:53:01.190 回答
6

我相信强制 textView 更新其 contentSize 的正确方法是调用

[textView layoutIfNeeded]

但是,在 iOS 7.0 和 7.1 中,除非您首先设置,否则这似乎仍然无法可靠地工作

textView.layoutManager.allowsNonContiguousLayout = false;

我不清楚这是否是一个错误,因为我真的无法很好地解释“非连续布局”的含义。

(我的个人用例是以textView.text = newValue编程方式更新,然后尝试适当地调整 textView 的大小。)

于 2014-03-11T17:30:21.833 回答
3
[textView sizeToFit];

是你需要的。

您需要做的就是确保:

[textView setScrollEnabled:YES];

在设置 UITextView 文本内容之前。

然后您可以:

[textView sizeToFit];
[textView setScrollEnabled:NO];

设置好文字后。与编写自己的 bling 函数或使用复杂的边界 rect 方法相同。当解决方案像三行一样简单时,为什么要使用如此复杂的东西?

也就是说,像这样包装这些函数:

- (void) setText:(NSString *)theTextToAdd andResizeTheDamnTextView:(UITextView *)textView {
    [textView setScrollEnabled:YES];
    [textView setText:theTextToAdd];
    [textView sizeToFit];
    [textView setScrollEnabled:NO];
}

并在每个文件或全局基础上定义它,以避免必须手动编写或复制/粘贴四行并每次调用它。只需将其称为:

[yourTextViewIvar setText:@"DUMMY STRING" andResizeTheDamnTextView:yourTextViewIvar];

如果这不起作用:

[yourTextViewIvar setText:[self setText:@"DUMMY STRING" andResizeTheDamnTextView:yourTextViewIvar]];

你会是金色的。

我认为..

那是伪代码。仅供参考。

于 2013-10-18T10:10:43.137 回答
-1

一个更简单的解决方案是使用:

[textViewExample sizeToFit];    

这对我有用。

于 2013-09-25T15:51:16.157 回答