1. 程式人生 > >UITableViewCell 中的輸入框,動態改變高度。

UITableViewCell 中的輸入框,動態改變高度。

根據輸入的內容,動態的改變高度,還是很好實現的。
按照一下的步驟,就可以了。

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



作者:囧rg
連結:https://www.jianshu.com/p/575d2db52da8
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。