iOS-自适应高度的TableViewCell

自定义IOTextView,高度自增自减

如何实现UITextView文本框高度随文字行数自动增减呢?

思路1、UITextView的Delegate方法

-textViewDidChange:
在Text变化时计算文字高度,刷新TextView高度
问题:
Text变化与实际有出入,此时的问题变化还没有存储到TextView的Text中,现在进行计算会得到上一个状态下的文字高度,导致TextView高度刷新延迟,换行第二个文字才增加高度,如果采用这个方法,就要进行文字拼接,再计算文字高度。
实现:不够优雅,不实现。

思路2、TextView本质是一个ScrollView,文字高度超出TextView高度会自动增加contentSize属性的height,而且增加的高度刚好就是TextView需要改变的高度,不错。

实现:
//宽度、高度与坐标

\#define Main_Screen_Height      [[UIScreen mainScreen] bounds].size.height   
\#define Main_Screen_Width       [[UIScreen mainScreen] bounds].size.width
static float TextViewDefaultHeight = 30.;  
static float TextViewDefaultY = 5.;  
static float TextViewContentSizeDefaultHeight = 22.;  
//测试中使用[UIFont systemFontOfSize:14],每行高度变化为17
self.TextViewInput = [[UITextView alloc]initWithFrame:CGRectMake(45, UUInputTextViewDefaultY, Main_Screen_Width, UUInputTextViewDefaultHeight)];  
[self.TextViewInput setContentSize:CGSizeMake(self.TextViewInput.width, UUInputTextViewContentSizeDefaultHeight)];  
self.TextViewInput.delegate = self;  
self.TextViewInput.font = [UIFont systemFontOfSize:14];  
self.TextViewInput.textContainerInset = UIEdgeInsetsMake(6,0, 0, 0);  
//KVO监听TextViewInput的contentSize变化  
NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;  
[self.TextViewInput addObserver:self forKeyPath:@"contentSize" options:options context:nil];  
[self addSubview:self.TextViewInput];  
\#pragma mark -- KVO --
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {  
if ([keyPath isEqualToString:@"contentSize"]){  
//最高行数设置,本demo中最高四行,对应paste场景  
    if (self.TextViewInput.height > UUInputTextViewDefaultHeight+17*2 && self.TextViewInput.contentSize.height > UUInputTextViewContentSizeDefaultHeight+17*2) {  
        return;  
    }  
    //文本为空时处理,对应文字发送、cut场景  
    if (self.TextViewInput.text.length == 0) {  
        [UIView animateWithDuration:0.3 animations:^{  
            self.TextViewInput.frame = CGRectMake(45, UUInputTextViewDefaultY, Main_Screen_Width-2*45, UUInputTextViewDefaultHeight);  
        } completion:nil];  
        return;  
    }  
    CGRect frame = self.TextViewInput.frame;
    //高度变化值  
    float changeHeight = self.TextViewInput.contentSize.height - UUInputTextViewContentSizeDefaultHeight;  
    //超过限定高度的场景处理  
    if (changeHeight > 17*2) {  
        changeHeight = 17*2;  
    }  
    frame.origin.y = UUInputTextViewDefaultY - changeHeight;  
    frame.size.height = UUInputTextViewDefaultHeight + changeHeight;  
    //动画效果  
    [UIView animateWithDuration:0.3 animations:^{  
        self.TextViewInput.frame = frame;  
    } completion:nil];  
    NSLog(@"%lf--    TextViewInput",self.TextViewInput.contentSize.height);  
    }  
}  

//注意要注销KVO

-(void)dealloc{    
    [self.TextViewInput removeObserver:self forKeyPath:@"contentSize"];  
} 

效果图:

  Total:    No.