写在iOS8后
tableView是一个在iOS开发上经常使用到的控件,而我们经常需要动态计算每一个cell的高度来进行适配,特别是实时输入的时候,在iOS8之前,我们的思路是根据每一个row的内容进行计算高度值然后才去赋值给每一行,然后展开行高,这样在数据量比较大的时候卡顿就会很明显了。而这个问题再iOS8后得到了一个比较好的处理—->自适应cell。
tableViewCell添加textView基本原理:
1、在XIB中设置好textView的autolayout,主要是要让xib知道你这个输入框上下左右设定距离,不能是相对设置,不然它读不到你的设定,不知道先更新谁更新多少,这个设置就失效了,
2、在textview中输入内容,根据内容更新textview的高度。
3、调用tableView的beginUpdates和endUpdates,重新刷新该行高。
4、记得先保存好当前的数据,避免tableView滚动的时候,将数据刷新回去原来的数据了。
autolayout设置的小细节
在利用xib拖拽textView时,记得设置UITextView 的 scrollEnable 为 NO。这一点很关键,如果不设置为 NO,UITextView在内容超出 frame 后,重新设置 textView的高度会失效并且滚动条也会出现。
高度的更新
可以在 TextViewCell.m 中实现
- (void)textViewDidChange:(UITextView *)textView,
每次 textView 内容改变的时候,就重新计算一次 textView 的大小,并让 tableView更新高度。
个人的做法是直接写一个更新高度的delegate,在vc里面调用刷新当前界面。将其分离。
相关的代码如下:
- (void)textViewDidChange:(UITextView *)textView
{
CGRect bounds = textView.bounds;
// 计算 text view 的高度
CGSize maxSize = CGSizeMake(bounds.size.width, CGFLOAT_MAX);
CGSize newSize = [textView sizeThatFits:maxSize];
bounds.size = newSize;
textView.bounds = bounds;
// 让 table view 重新计算高度
UITableView *tableView = [self tableView];
[tableView beginUpdates];
[tableView endUpdates];
}
写在最后
其实简单的来说就利用iOS8的自动计算cell机制
对textView做处理,更新tableView利用beginUpdates跟endUpdates,最后更新数据源。