美文网首页
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