IOS - UITableViewCell 中的输入框,动态改变高度。

转载自: https://www.jianshu.com/p/575d2db52da8

根据输入的内容,动态的改变高度,还是很好实现的。
按照一下的步骤,就可以了。

textViewDidChange {
    sizeThatFits //计算出需要多高
    cellHeight = Height //设置成算出来的高度
    self.tableView.beginUpdates()  //更新tableview
    self.tableView.endUpdates()
}

但是,在现实的项目中,会遇到各种的问题。其中之一的就是,在改变高度的时候,刷新tableview界面,上下的乱跳(遇到的自然就会理解)。

111.gif

其中的一个方案是(在部分系统上是可以的,但是还是存在问题):
1、在开始编辑的时候,先把textview高度增加些。
2、在编辑结束的时候,再把高度变回来。
3、在内容改变时,动态计算高度,并把高度增加些。

/**
 *  开始编辑
 */
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
  // 计算textview的高度
  CGFloat newHeight = [self cellHeight]+30;
  // 改变高度
    id<RichTableViewDelegate> delegate = (id<RichTableViewDelegate>)self.richTableView.delegate;
    [delegate tableView:self.richTableView updatedHeight:newHeight atIndexPath:self.curIndexPath];
  // 刷新列表
    [self.richTableView beginUpdates];
    [self.richTableView endUpdates];
  return YES;
}

/**
 结束编辑
 */
- (BOOL)textViewShouldEndEditing:(UITextView *)textView
{
    CGFloat newHeight = [self cellHeight];
    id<RichTableViewDelegate> delegate = (id<RichTableViewDelegate>)self.richTableView.delegate;
    [delegate tableView:self.richTableView updatedHeight:newHeight atIndexPath:self.curIndexPath];
    [self.richTableView beginUpdates];
    [self.richTableView endUpdates];
    return YES;
}

/**
 *  内容改变
 */
- (void)textViewDidChange:(UITextView *)textView
{
    /*
      doSomeThing
    */
    id<RichTableViewDelegate> delegate = (id<RichTableViewDelegate>)self.richTableView.delegate;
    NSIndexPath *indexPath = [self.richTableView indexPathForCell:self];
    // 更新文本信息
    [delegate tableView:self.richTableView updatedText:self.textView.attributedText atIndexPath:indexPath];
    
    CGFloat newHeight = [self cellHeight];
    CGFloat oldHeight = [delegate tableView:self.richTableView heightForRowAtIndexPath:indexPath];
    if (fabs(newHeight - oldHeight) > 0.01) {
        // 更新高度
        newHeight += 30;
        if ([delegate respondsToSelector:@selector(tableView:updatedHeight:atIndexPath:)]) {
            [delegate tableView:self.richTableView updatedHeight:newHeight atIndexPath:indexPath];
        }
        // 刷新tableview
        [self.richTableView beginUpdates];
        [self.richTableView endUpdates];  
    }
    /*
      doSomeThing
    */
}

最后我再分享一个可以完美解决的方案
原理:在高度变化的时候,计算出偏移量,让tableview进行移动后,再进行更新高度。

/**
 *  内容改变
 */
- (void)textViewDidChange:(UITextView *)textView
{
    // ......
    // 更新文本信息
    [delegate tableView:self.richTableView updatedText:self.textView.attributedText atIndexPath:indexPath];
    
    CGFloat newHeight = [self cellHeight];
    CGFloat oldHeight = [delegate tableView:self.richTableView heightForRowAtIndexPath:indexPath];
    
    if (fabs(newHeight - oldHeight) > 0.01) {
        
        if (self.richTableView.contentSize.height >= self.richTableView.height &&
            self.maxY - self.richTableView.contentOffset.y > self.richTableView.height ) {
            float pyl = self.richTableView.contentOffset.y + fabs(newHeight - oldHeight);
            [self.richTableView setContentOffset:CGPointMake(0, pyl)];
        }
        
        // 更新高度
        if ([delegate respondsToSelector:@selector(tableView:updatedHeight:atIndexPath:)]) {
            [delegate tableView:self.richTableView updatedHeight:newHeight atIndexPath:indexPath];
        }
        // 刷新tableview
        [self.richTableView beginUpdates];
        [self.richTableView endUpdates];
    }
}

222.gif

具体的Demo,网上有现成的,不过没有解决这个问题,可供大家作为参考用。
UITableViewCell输入文本动态变高Demo下载
当然还有一些其他人的分享,大家也可以围观下。
iOS UItableviewCell实现可变高度的UITextView,动态刷新高度
UITableViewCell 输入框动态变高
输入文字动态改变textView的高度来改变cell的高度



作者:囧rg
链接:https://www.jianshu.com/p/575d2db52da8
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值