iOS开发日记-tableviewCell的自适应续(填坑)
上一篇tableviewCell的自适应文章中讲了cell中有textView控件时,根据输入的内容动态自适应Cell的高度.虽然上文实现了功能,但是我在后面的使用中,有一些小瑕疵,或者说是坑吧,今天就来填这个坑.
一.坑的来源
先上图片吧,再来说吧.
这张设计图中,有两个输入,嘉宾名称是一个textField,嘉宾简介是一个textView,很明显嘉宾介绍肯定是要做自适应的.点击下面的添加活动嘉宾会增加一个Cell,来增加一个嘉宾信息.按照之前的方法,一个嘉宾是没有问题的.当增加很多个嘉宾设置的时候,问题来了,由于使用了下面两句代码实现Cell的样式更新,虽然中间看似什么也没有做,我们在编辑的时候,由于是时候根据内容在动态计算更新cell的大小,加上键盘对输入框焦点,会导致Cell不停的乱跳,无法锁定在当前的输入的输入框.下面就来解决输入的时候Cell乱跳的坑.
[tableView beginUpdates];
[tableView endUpdates];
二.填坑
之前我是在自定义Cell中,在textViewDidChange方法中更新Cell大小,也就是下面两句话:
[tableView beginUpdates];
[tableView endUpdates];
但是后来不管怎么改,只要Cell很多,编辑的时候Cell就会乱跳,后来经过万般寻找,终于找到了合适的办法.我在textViewDidChange有个回调方法,使其能够在controller中动态知道输入的内容.直接上代码吧.
//textViewDidChange中回调在Controller中的实现
-(void)AddGestInfoCellTextViewChangeEventWith:(UITableViewCell *)cell andTextView:(UITextView *)textView{
//保存输入用户动态输入的内容
NSIndexPath * currentIndexPath = [self.tableView indexPathForCell:cell];
ActivityGuestInfoModel * guestInfoModel = self.dataSource[currentIndexPath.row];
guestInfoModel.introduction = textView.text;
///动态更新Cell大小
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];
//重点就是这个方法,调整Cell的大小之后,就要保持当前Cell不会跳动
[self scrollToCursorForTextView:textView];
}
下面就是 scrollToCursorForTextView:方法的具体实现,目的就是保证编辑的当前Cell不会更加输入内容,而胡乱跳动,代码如下:
- (void)scrollToCursorForTextView: (UITextView*)textView {
//获取光标的位置区域
CGRect cursorRect = [textView caretRectForPosition:textView.selectedTextRange.start];
//转换坐标系
cursorRect = [self.tableView convertRect:cursorRect fromView:textView];
//判断光标是否在可见区域
if (![self rectVisible:cursorRect]) {
//没有在可见区域则滚动到可见区域
cursorRect.size.height += 8; // To add some space underneath the cursor
[self.tableView scrollRectToVisible:cursorRect animated:YES];
}
}
//判断是否在可见区域
- (BOOL)rectVisible: (CGRect)rect {
CGRect visibleRect;
visibleRect.origin = self.tableView.contentOffset;
visibleRect.origin.y += self.tableView.contentInset.top;
visibleRect.size = self.tableView.bounds.size;
visibleRect.size.height -= self.tableView.contentInset.top + self.tableView.contentInset.bottom;
return CGRectContainsRect(visibleRect, rect);
}
总结
其实解决的方法很简单,却烦恼了我很久,感觉万能的stackOverFlow.认真反思一下,觉得自己对问题的思考还不够深入,导致没有烦恼了很久都没找到好的解决方案.很久没更写文章了,其实最近一直在反思自己的码砖方式,对自己要求还不够严格,代码结构,代码的规范,代码的重构,都没严格的要求自己,还是在一味的去实现功能,随意的写一些代码.所以下一步目标,严格要求自己,提高自己的代码质量.后面会分享一些收集的编码的一些Tips.
后记
如果大家对上文有什么疑问,欢迎留言讨论,或者私信与我.同时,上文有什么不对的地方,欢迎大家指正,谢谢大家!分享是一件快乐的事情!