/

UITableViewCell 自适应 UITextView 高度

使用 Auto Layout 让 UITableViewCell 自适应 UITextView 高度,效果演示:

Self-sizing UITextView in cell

99-projects-of-swift/029-tableviewcell-self-adaption

预备步骤

  1. 给 textView 上下左右建立相对于 cell 的约束
  2. 取消 textView 的 Scrolling Enabled
  3. 设置 tableView 估算高度 tableView.estimatedRowHeight = 70
  4. 设置 textView.delegate = self

关键点

如果在 textViewDidChange(textView:) 调用 tableView.reloadData() 会造成 textView 失去焦点,键盘隐藏。

解决方法:

func textViewDidChange(textView: UITextView) {
tableView.beginUpdates()
tableView.endUpdates()
}

这里带来了一个问题,当 textView 长度超过一屏或者过长时,在输入时 tableView 会跳动滚动 jumping and stuttering。

更好的解决方法:

func textViewDidChange(textView: UITextView) {
let currentOffset = tableView.contentOffset
UIView.setAnimationsEnabled(false)
tableView.beginUpdates()
tableView.endUpdates()
UIView.setAnimationsEnabled(true)
tableView.setContentOffset(currentOffset, animated: false)
}

禁用动画和重建表视图的内容偏移修正抖动。

Reference: