UITableViewCell 中的輸入框,動態改變高度。
阿新 • • 發佈:2019-02-11
根據輸入的內容,動態的改變高度,還是很好實現的。
按照一下的步驟,就可以了。
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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。