iOS开发日记-tableviewCell的自适应续(填坑)

iOS开发日记-tableviewCell的自适应续(填坑)

上一篇tableviewCell的自适应文章中讲了cell中有textView控件时,根据输入的内容动态自适应Cell的高度.虽然上文实现了功能,但是我在后面的使用中,有一些小瑕疵,或者说是坑吧,今天就来填这个坑.

一.坑的来源

先上图片吧,再来说吧.

iOS开发日记-tableviewCell的自适应续(填坑)_第1张图片
设置嘉宾.png

这张设计图中,有两个输入,嘉宾名称是一个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.

后记

如果大家对上文有什么疑问,欢迎留言讨论,或者私信与我.同时,上文有什么不对的地方,欢迎大家指正,谢谢大家!分享是一件快乐的事情!

你可能感兴趣的:(iOS开发日记-tableviewCell的自适应续(填坑))