0%

iOS高度自适应的TextView

如何实现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"];
}