下面的代码片段用于在安装Xcode 5之前将UITextView框架的大小调整为其内容高度,但自升级以来它不起作用:
CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;
我搜索过但没找到修复程序。有什么想法吗?
答案 0 :(得分:26)
iOS 7上有新功能。
要在文本视图更新其文本后获取文本视图使用的“拟合”大小,请在textView的usedRectForTextContainer:
属性上调用layoutManager
,并将textView的textContainer
属性作为参数传递。
关于滚动的警告:但是,请注意,如果在文本视图之后更改文本视图的框架大小已经更新了它的文本,则在文本视图中禁用滚动时会出现意外的视觉错误。如果发生这种情况,请在编辑文本视图的文本之前设置滚动,然后在更新后禁用它(如果需要滚动以保持禁用状态)。
答案 1 :(得分:14)
要在iOS 7(Xcode 5)中工作,只需:
通过设置:
,让整个空间接收文本 [myTextView setScrollEnabled:YES];
传递真实文字:
myTextView.text = theTextVariable;
或myTextView.text = @"The text...";
自动调整textView:
[myTextView sizeToFit];
禁用滚动:
[myTextView setScrollEnabled:NO];
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];
这项工作适合我。