将UITextView框架设置为内容大小不再适用于Xcode 5

时间:2013-09-17 20:49:46

标签: objective-c xcode5

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

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

我搜索过但没找到修复程序。有什么想法吗?

5 个答案:

答案 0 :(得分:26)

iOS 7上有新功能。

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

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

答案 1 :(得分:14)

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

  1. 通过设置:

    ,让整个空间接收文本

    [myTextView setScrollEnabled:YES];

  2. 传递真实文字:

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

  3. 自动调整textView:

    [myTextView sizeToFit];

  4. 禁用滚动:

    [myTextView setScrollEnabled:NO];

  5. P.S:myTextView也可以用作self.myTextView或_myTextView

    玩得开心!

答案 2 :(得分:6)

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

[textView layoutIfNeeded]

但是,在iOS 7.0和7.1中,除非您先设置

,否则这似乎仍然无法可靠地工作
textView.layoutManager.allowsNonContiguousLayout = false;

我不清楚这是否是一个错误,因为我无法真正找到“非连续布局”甚至意味着什么的好解释。

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

答案 3 :(得分:3)

[textView sizeToFit];

是你需要的。

您需要做的就是确保:

[textView setScrollEnabled:YES];

在设置UITextView文本内容之前。

然后你可以:

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

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

也就是说,将这些函数包装起来:

- (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]];

你会成为金色的。

我想..

那是伪代码。仅供参考。

答案 4 :(得分:-1)

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

[textViewExample sizeToFit];    

这项工作适合我。