LOFTER app需要实现了一个类似iPhone短信输入框的功能,它的功能其实蛮简单,就是:【UITextView的高度随着内容高度的变化而变化】。实现思路应该是:
这看起来很简单。 添加内容变化的通知响应事件: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name: UITextViewTextDidChangeNotification object:nil]; 计算内容高度有两种方式:
2. textView继承自UIScrollView,直接从contentSize属性获取
第一种方式拿出来的高度需要再加上padding的值才是最终的值,并且需要指定constrainedToSize,不太灵活。第二种方法简单直接准确,我选择了它。 在IOS 5.0及以上,以上实现已经足够完美了。在IOS4.3中发现了bug,当文本框变成多行,然后清空文本框再输入文字时,发现内容和光标跑到了UITextView上方并且不可见。Google关键字"one line uitextview"可以发现类似的bug提问。经过查证资料和跟踪代码,根本原因应该UITextView的Insets.bottom在文本输入的过程中被不断地自动设置造成的。这是UITextView的默认实现行为,但这肯定是IOS4.3的bug,而IOS5.0修复了它。解决办法就是试图阻止UITextView设置contentInset,我们可以继承UITextView并且覆盖setContentInset:方法来达到目的,在setContentInset:里只需要设置一个固定的contentInset.bottom即可。 还有一个地方需要注意,当你清空输入框时(_textView.text=@"";),不会自动触发textChanged:,你需要重写setText:方法来调用textChanged:。并且你清空textview后,你拿到的contentsize也不准确,所以还需要根据text是否为空来设定一个最小的高度。 |
|