根据输入的内容,动态的改变高度,还是很好实现的。
按照一下的步骤,就可以了。
textViewDidChange {
sizeThatFits //计算出需要多高
cellHeight = Height //设置成算出来的高度
self.tableView.beginUpdates() //更新tableview
self.tableView.endUpdates()
}
但是,在现实的项目中,会遇到各种的问题。其中之一的就是,在改变高度的时候,刷新tableview界面,上下的乱跳(遇到的自然就会理解)。

其中的一个方案是(在部分系统上是可以的,但是还是存在问题):
1、在开始编辑的时候,先把textview高度增加些。
2、在编辑结束的时候,再把高度变回来。
3、在内容改变时,动态计算高度,并把高度增加些。
/**
* 开始编辑
*/
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
// 计算textview的高度
CGFloat newHeight = [self cellHeight]+30;
// 改变高度
id<RichTableViewDelegate> delegate = (id<RichTableViewDelegate>)self.richTableView.delegate;
[delegate tableView:self.richTableView updatedHeight:newHeight atIndexPath:self.curIndexPath];
// 刷新列表
[self.richTableView beginUpdates];
[self.richTableView endUpdates];
return YES;
}
/**
结束编辑
*/
- (BOOL)textViewShouldEndEditing:(UITextView *)textView
{
CGFloat newHeight = [self cellHeight];
id<RichTableViewDelegate> delegate = (id<RichTableViewDelegate>)self.richTableView.delegate;
[delegate tableView:self.richTableView updatedHeight:newHeight atIndexPath:self.curIndexPath];
[self.richTableView beginUpdates];
[self.richTableView endUpdates];
return YES;
}
/**
* 内容改变
*/
- (void)textViewDidChange:(UITextView *)textView
{
/*
doSomeThing
*/
id<RichTableViewDelegate> delegate = (id<RichTableViewDelegate>)self.richTableView.delegate;
NSIndexPath *indexPath = [self.richTableView indexPathForCell:self];
// 更新文本信息
[delegate tableView:self.richTableView updatedText:self.textView.attributedText atIndexPath:indexPath];
CGFloat newHeight = [self cellHeight];
CGFloat oldHeight = [delegate tableView:self.richTableView heightForRowAtIndexPath:indexPath];
if (fabs(newHeight - oldHeight) > 0.01) {
// 更新高度
newHeight += 30;
if ([delegate respondsToSelector:@selector(tableView:updatedHeight:atIndexPath:)]) {
[delegate tableView:self.richTableView updatedHeight:newHeight atIndexPath:indexPath];
}
// 刷新tableview
[self.richTableView beginUpdates];
[self.richTableView endUpdates];
}
/*
doSomeThing
*/
}
最后我再分享一个可以完美解决的方案
原理:在高度变化的时候,计算出偏移量,让tableview进行移动后,再进行更新高度。
/**
* 内容改变
*/
- (void)textViewDidChange:(UITextView *)textView
{
// ......
// 更新文本信息
[delegate tableView:self.richTableView updatedText:self.textView.attributedText atIndexPath:indexPath];
CGFloat newHeight = [self cellHeight];
CGFloat oldHeight = [delegate tableView:self.richTableView heightForRowAtIndexPath:indexPath];
if (fabs(newHeight - oldHeight) > 0.01) {
if (self.richTableView.contentSize.height >= self.richTableView.height &&
self.maxY - self.richTableView.contentOffset.y > self.richTableView.height ) {
float pyl = self.richTableView.contentOffset.y + fabs(newHeight - oldHeight);
[self.richTableView setContentOffset:CGPointMake(0, pyl)];
}
// 更新高度
if ([delegate respondsToSelector:@selector(tableView:updatedHeight:atIndexPath:)]) {
[delegate tableView:self.richTableView updatedHeight:newHeight atIndexPath:indexPath];
}
// 刷新tableview
[self.richTableView beginUpdates];
[self.richTableView endUpdates];
}
}

具体的Demo,网上有现成的,不过没有解决这个问题,可供大家作为参考用。
UITableViewCell输入文本动态变高Demo下载
当然还有一些其他人的分享,大家也可以围观下。
iOS UItableviewCell实现可变高度的UITextView,动态刷新高度
UITableViewCell 输入框动态变高
输入文字动态改变textView的高度来改变cell的高度
网友评论