2012-11-21 33 views
10

我正在创建一个评论部分,非常类似于Facebook在iOS应用中使用它的消息部分。我想UITextView调整高度的大小,以便我输入的文本适合其内部,而不必滚动查看溢出的文本。任何想法我可能会这样做?我看着,也许使用分配给的大小和文本视图的高度,然后匹配的内容大小CGRect如何在UITextView里面输入时调整它的大小?

CGRect textFrame = textView.frame; 
textFrame.size.height = textView.contentSize.height; 
textView.frame = textFrame; 

我想我需要某种功能检测当文本到达UITextView的边界,然后调整视图的高度?有没有人与这个相同的概念挣扎?

+0

你可以找到详细的工作解决方案[这里](http://stackoverflow.com/a/37633816/2066428) – malex

回答

20

您可以在此委托方法中调整框架,不要忘记将textView的委托设置为self。

-(BOOL)textView:(UITextView *)_textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 
     [self adjustFrames]; 
     return YES; 
} 


-(void) adjustFrames 
{ 
    CGRect textFrame = textView.frame; 
    textFrame.size.height = textView.contentSize.height; 
    textView.frame = textFrame; 
} 

该解决方案是iOS6的和以前的...为iOS7请参阅本

StackOverflow Answer

+0

噢真的吗?我不认为这会是那么简单..好吧,谢谢我会放弃! – Ollie177

+0

非常感谢您的帮助! – Ollie177

+3

这并不在iOS 7.0 – Stavash

1

contentsize将无法​​工作在IOS 7 试试这个:

CGFloat textViewContentHeight = textView.contentSize.height; 

textViewContentHeight = ceilf([textView sizeThatFits:textView.frame.size].height + 9); 
+4

为什么幻数? – vvMINOvv

6

这是我的解决方案,使用自动布局textView.contentSize.height。在iOS8 Xcode6.3 beta4上测试。

最后有一个关于setContentOffset的问题。当行数改变时,我会避免“错误的contentoffset”假象。它在最后一行下面增加了一个额外的不需要的空白,除非您在更改约束后立即将其设置回去,否则它看起来不太好。花了我几个小时弄清楚了这一点!

// set this up somewhere 
let minTextViewHeight: CGFloat = 32 
let maxTextViewHeight: CGFloat = 64 

func textViewDidChange(textView: UITextView) { 

    var height = ceil(textView.contentSize.height) // ceil to avoid decimal 

    if (height < minTextViewHeight + 5) { // min cap, + 5 to avoid tiny height difference at min height 
     height = minTextViewHeight 
    } 
    if (height > maxTextViewHeight) { // max cap 
     height = maxTextViewHeight 
    } 

    if height != textViewHeight.constant { // set when height changed 
     textViewHeight.constant = height // change the value of NSLayoutConstraint 
     textView.setContentOffset(CGPointZero, animated: false) // scroll to top to avoid "wrong contentOffset" artefact when line count changes 
    } 
} 
+0

“textViewHeight”声明在哪里? – lf215

+1

@ lf215这是对的UITextView的高度'NSLayoutConstraint'对象。我忘了补充一点。 – Hlung

+0

我对此很新。您能否详细说明/添加更多代码以显示如何获取textViewHeight? – lf215

4

在持有的UITextView中的TableViewController,更新从tableViewDataSource是被放置在单元格,然后简单地把它称做数据:

tableView.beginUpdates() 
    tableView.endUpdates() 

不像tableView.reloadData(),这不调用resignFirstResponder

+0

这是完美的!谢谢。在这里,在ObjC相同的:' - (无效)textViewDidChange:(UITextView的*)的TextView {[self.tableView beginUpdates]; [self.tableView endUpdates]; }'你甚至可以免费获得动画;) – Holtwick

2

首先设定最低高度限制你的TextView:

textView.heightAnchor.constraint(greaterThanOrEqualTo: view.heightAnchor, multiplier: 0.20) 

(请确保您设置greaterThanOrEqualTo约束,这样,如果内在的内容高度比该高度以上,它需要内在的内容高度)

或简单的常数

textView.heightAnchor.constraint(greaterThanOrEqualToConstant: someConstant) 

在配置你的TextView,设置isScrollEnabled到假

textView.isScrollEnabled = false 

现在,当你在TextView的类型,它的内在内容的大小高度将增加,它会自动将它下面的意见。

相关问题