UITableViewCell KeyBoard内避免了动态TextView问题?

时间:2019-05-27 21:38:43

标签: ios objective-c uitableview uitextview uitableviewautomaticdimension

在互联网上搜索 2天后,我决定在这里发布我认为大多数人都知道的问题。

我正在尝试在自定义TextView中使用具有{strong>动态高度的tableViewCell,该名称易于使用textView delegate {{1 }},将表视图告知TextChange,并在 tableview start/end update委托中使用UITableViewAutomaticDimension。单元格将扩展和收缩取决于文本,但这不是问题,

heightForRowAtIndexPath

用户继续输入时出现的问题,并且textView没有最高提示,并且不可滚动,文本将在下方键盘。您可以在第一个Gif中看到。

enter image description here

所以,我尝试了所有事情:

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。

enter image description here

对于将发布此链接dynamic hight cell作为解决方案的任何人,我都想让他知道此解决方案基于UITableViewController而不是UIViewController构建。

更新#1

我尝试如下在beginUpdates / endUpdates之前停止动画,并且第一次开始填充textview时,跳跃消失了,但是当删除所有文本并再次尝试填充动画时,避免了键盘停止:

content size

1 个答案:

答案 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)
}
}

享受