美文网首页
iOS cell中的textView被键盘遮挡完美解决方案

iOS cell中的textView被键盘遮挡完美解决方案

作者: 翻滚的炒勺2013 | 来源:发表于2018-05-26 10:25 被阅读648次
    最喜欢的.jpg

    需求:
    当用户开始编辑的时候,键盘弹起使其不被遮挡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一样,没有相应的中间动画
    

    详细了解beginUpdates&&endUpdates

    刷新之后需要返回给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


    相关文章

      网友评论

          本文标题:iOS cell中的textView被键盘遮挡完美解决方案

          本文链接:https://www.haomeiwen.com/subject/vxopjftx.html