在Swift中展开和编辑iOS表格单元格

来自 petethedeveloper.com的交叉发布

最近,我们实现了一项功能,该功能允许用户向UITextView中输入任意数量的文本,而UITextView本身包含在UITableViewCell中。 要求如下:

  1. textview不可滚动。 而是,textview应该随着内容大小的增加/减小而扩展/折叠。 textview永远不会小于指定的基本大小
  2. 单元格应该因为包含的textview展开/折叠而展开/折叠

下面,我描述我们如何做到的。

实施

实现分为三个步骤:

  • 当textview的内容更改时,计算显示所有内容所需的框架的大小。 这是使用以下方法在UITextViewDelegate textViewDidChange(textView :)方法中计算的;
  / *计算显示所包含内容所需的帧大小 
内容* /
让fixedWidth = textView.frame.size.width
让newSize = textView.sizeThatFits(CGSize(width:fixedWidth,height:.greatestFiniteMagnitude))
var newFrame = textView.frame
  • 如果显示文本所需的框架大小与当前的textview框架大小不同,请更新textview框架的大小。 请记住,我们绝不会将textview框架的大小更新为小于我们指定的基本框架大小;
  //我们的基本身高 
let baseHeight:CGFloat = 50
  / *我们的新高度绝对不能小于我们的基本高度,因此请使用两个中的较大者* / 
让高度:CGFloat = newSize.height> baseHeight? newSize.height:baseHeight
newFrame.size = CGSize(width:max(newSize.width,fixedWidth),height:height)
  • 当textview的框架大小更改时,更新out表单元格的大小以匹配所包含textview大小的大小。 我们使用委托协议来告诉UITableViewController更新单元格高度。 我们传递计算出的框架高度,然后将其作为单元格的高度返回给UITableViewDelegate tableView(:heightForRowAt :)方法;
  //保存新高度 
EditorialCellHeight = newHeight
  //禁用动画可以使我们达到预期的行为 
UIView.setAnimationsEnabled(false)
  / *这些将导致表单元格的高度重新计算, 
无需重新加载整个单元* /
tableView.beginUpdates()
tableView.endUpdates()
  //重新启用动画 
UIView.setAnimationsEnabled(true)