需求:
当用户开始编辑的时候,键盘弹起使其不被遮挡cell中的textView
textView会随着用户文字的增加高度变高,同时cell的高度增加
分析:
用户开始输入的时候键盘自动弹起这个功能IQ已经帮我们做好了,我们只需要将IQKeyboardManager pod进项目中
textView会随着用户文字的增加高度变高,同时cell的高度增加,就需要我们自己来实现了
首先在代理方法中- (void)textViewDidChange:(UITextView *)textView 重新设置textView的高度
- (void)textViewDidChange:(UITextView *)textView{
if ([self.delegate respondsToSelector:@selector(submitSuggestDescribeCurrentCell:text:submitSuggestMData:)]) {
[self.delegate submitSuggestDescribeCurrentCell:self text:textView.text submitSuggestMData:self.rowMData];
}
CGRect frame = textView.frame;
CGSize constraintSize = CGSizeMake(frame.size.width, MAXFLOAT);
CGSize size = [textView sizeThatFits:constraintSize];
textView.frame = CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, size.height)
submitSuggestDescribeCurrentCell:text:submitSuggestMData:这个方法是把用户输入的内容传到控制器
传到控制器之后还要执行刷新tableView
这里刷新tableView的方法是
[self..tableView beginUpdates];
[self.tableView endUpdates];
说明:
1、beginUpdates 和 endUpdates必须成对使用
2、使用beginUpdates和endUpdates可以在改变一些行(row)的高度时自带动画,并且不需要Reload row(不用调用cellForRow,仅仅需要调用heightForRow,这样效率最高)。
3、在beginUpdates和endUpdates中执行insert,delete,select,reload row时,动画效果更加同步和顺滑,否则动画卡顿且table的属性(如row count)可能会失效。
4、在beginUpdates 和 endUpdates中执行 reloadData 方法和直接reloadData一样,没有相应的中间动画
刷新之后需要返回给cell新的高度,在cell中写一个get方法
- (CGFloat)getCellHeight {
CGSize size = [self.textView sizeThatFits:CGSizeMake(self.textView.frame.size.width, MAXFLOAT)];
return size.height+5;
}
在- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath中调用获取新的高度,这时候的效果是这样的
Untitled.gif
虽然textView和tableView的高度都改变了,但是还是被键盘遮挡住了,给用户的体验很不好
这时我们只需要在定义一个height,当textView高度改变也就是换新的一行的时候去刷新tableView
if (self.height != size.height) {
self.height = size.height;
//
[UIView performWithoutAnimation:^{
[self.rowMData.tableView beginUpdates];
[self.rowMData.tableView endUpdates];
}];
//
}
加上这行代码后的效果就是这样
效果.gif
end
网友评论