如何实现UITextView文本框高度随文字行数自动增减呢?
思路1、UITextView的Delegate方法
-textViewDidChange:
在Text变化时计算文字高度,刷新TextView高度
问题:Text变化与实际有出入,此时的问题变化还没有存储到TextView的Text中,现在进行计算会得到上一个状态下的文字高度,导致TextView高度刷新延迟,换行第二个文字才增加高度,如果采用这个方法,就要进行文字拼接,再计算文字高度。
思路2、TextView本质是一个ScrollView
文字高度超出TextView高度会自动增加contentSize属性的height,而且增加的高度刚好就是TextView需要改变的高度
实现:
设置默认UITextView的contentSize高度
1
| static float TextViewContentSizeDefaultHeight = xxx;
|
KVO监听TextViewInput的contentSize变化
1 2 3
| NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld; [self.TextViewInput addObserver:self forKeyPath:@"contentSize" options:options context:nil]; [self addSubview:self.TextViewInput];
|
变化处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (![object isKindOfClass:[BRPlaceholderTextView class]]) { return; } if ([keyPath isEqualToString:@"contentSize"]){ DLog(@"%@",change); static BOOL hasInit; if (!hasInit) { hasInit = YES; return; } CGFloat changeHeight = self.TextViewInput.contentSize.height - UUInputTextViewDefaultContentHeight; if (changeHeight > UUInputTextViewMaxHeight - UUInputTextViewDefaultContentHeight) { changeHeight = UUInputTextViewMaxHeight - UUInputTextViewDefaultContentHeight; } [self mdf_changeLayoutByChangeContentHeight:changeHeight]; } }
|
注意要注销KVO
1 2 3
| -(void)dealloc{ [self.TextViewInput removeObserver:self forKeyPath:@"contentSize"]; }
|