美文网首页UITableViewiOS开发iOS第三方资料收集
IOS - UITableViewCell 中的输入框,动态改变

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

作者: 囧rg | 来源:发表于2017-01-10 20:17 被阅读1076次

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

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的高度

相关文章

网友评论

  • CoderFC:大神,既然你说网上的demo没有完美的解决问题,可否整理个demo出来让大家学习观摩下?目前也用到了这个功能,但是处理了很久还是不够完美,请大神不吝赐教,感谢!
  • 熊猫小贼_:有demo么 大神
    囧rg:demo之前的确写过,放到项目中后,就给删了,就再也没有整理过。

本文标题:IOS - UITableViewCell 中的输入框,动态改变

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