在互联网上搜索 2天后,我决定在这里发布我认为大多数人都知道的问题。
我正在尝试在自定义TextView
中使用具有{strong>动态高度的tableViewCell
,该名称易于使用textView
delegate
{{1 }},将表视图告知TextChange
,并在 tableview start/end update
委托中使用UITableViewAutomaticDimension
。单元格将扩展和收缩取决于文本,但这不是问题,
heightForRowAtIndexPath
用户继续输入时出现的问题,并且textView没有最高提示,并且不可滚动,文本将在下方键盘。您可以在第一个Gif中看到。
所以,我尝试了所有事情:
1-更改表格视图-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 60.0;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewAutomaticDimension;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
ExpandableTextTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ExpandableTextTableViewCell_ID" forIndexPath:indexPath];
cell.cellTextView.text = description;
cell.cellTextView.tag = 2;
[cell.cellTextView setFont:FONT_SS_REGULAR(18)];
[cell.cellTextView setTextColor:[UIColor colorWithWhite:0.0 alpha:.7]];
[cell setOnUpdateCellDescription:^(NSString * _Nonnull cellDescription) {
description = cellDescription;
dispatch_async(dispatch_get_main_queue(), ^{
// Update the UI on the main thread.
[UIView setAnimationsEnabled:NO];
[tableView beginUpdates];
[tableView endUpdates];
[UIView setAnimationsEnabled:YES];
});
}];
return cell;
}
。
2- Bottom constraint
。
3- TPkeyboardavoidingtableview
。
4-我自己进行计算以更改IQkeyboardManagers
对于每种解决方案,Tableview都会开始疯狂跳动,请参阅第二个gif。
对于将发布此链接dynamic hight cell作为解决方案的任何人,我都想让他知道此解决方案基于UITableViewController而不是UIViewController构建。
更新#1
我尝试如下在beginUpdates / endUpdates之前停止动画,并且第一次开始填充textview时,跳跃消失了,但是当删除所有文本并再次尝试填充动画时,避免了键盘停止:
content size
答案 0 :(得分:-2)
首先,您需要为单元格创建一个委托,并在文本更改和编辑结束时进行侦听,还需要在单元格中保留单元格索引路径。
说:
protocol CustomTableViewCellDelegate: NSObjectProtocol {
func customTableViewCellDidBeginEditing(at indexPath: IndexPath, didFinish: Bool)
}
在单元格中将是您所知道的:
weak var delegate: CustomTableViewCellDelegate?
var cellIndexPath: IndexPath!
在视图控制器上使单元出队时:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell") as! CustomTableViewCell
cell.cellIndexPath = indexPath
cell.delegate = self
return cell
}
当文本开始更改时,您需要致电代表:
self.delegate?.customTableViewCellDidBeginEditing(at: self.cellIndexPath, didFinish: false)
对于带有文本视图的单元格,您想在以下情况下调用它:
func textViewDidChange(_ textView: UITextView) {
self.delegate?.customTableViewCellDidBeginEditing(at: self.cellIndexPath, didFinish: false)
}
func textViewDidBeginEditing(_ textView: UITextView) {
self.delegate?.customTableViewCellDidBeginEditing(at: self.cellIndexPath, didFinish: false)
}
当文本结束更改时,您需要调用委托:
self.delegate?.customTableViewCellDidBeginEditing(at: self.cellIndexPath, didFinish: true)
对于带有文本视图的单元格,您想在以下情况下调用它:
func textViewDidEndEditing(_ textView: UITextView) {
self.delegate?.customTableViewCellDidBeginEditing(at: self.cellIndexPath, didFinish: true)
}
在View控制器方面:
extension ViewController: CustomTableViewCellDelegate {
func customTableViewCellDidBeginEditing(at indexPath: IndexPath, didFinish: Bool) {
// Let assume the Keyboard height is 260 or you can listen to the keyboardWillShowNotification and get the keyboardFrame.cgRectValue.height
let keyboardHeight = 260
self.tableView.contentInset.bottom = didFinish ? keyboardHeight : 0
self.tableView.scrollToRow(at: indexPath, at: UITableView.ScrollPosition.bottom, animated: true)
}
}
享受