调整UITextView及包含它的部分的大小,而不会过度绘制下一个tableview部分

时间:2015-09-01 09:05:34

标签: swift uitableview autolayout uitextview

我有一个静态表,里面有四个部分。第三部分包含一个UITextView,如果用户输入多行,我想调整大小。我设法让这个工作,但我调整大小的textView透支了最后一个表格部分。

我发现很多关于此的旧文章有不同的解决方案,但对于我的静态表格,没有一个对我有用。

我所做的是让我的控制器实现UITextViewDelegate并编写了这个方法:

func textViewDidChange(textView: UITextView) {
    var frame = textView.frame
    frame.size.height = textView.contentSize.height
    textView.frame = frame

    tableView?.beginUpdates()
    tableView?.endUpdates()
}

有些文章建议编写一个高度约束,然后将其放在上面的方法中:

let size = reminderNameTextInput.bounds.size
let newSize = reminderNameTextInput.sizeThatFits(CGSize(width: size.width, height: CGFloat.max))

// Resize the cell only when cell's size is changed
if size.height != newSize.height {
    UIView.setAnimationsEnabled(false)
    tableView?.beginUpdates()
    tableView?.endUpdates()
}

无论如何,结果是一样的:textView增长并透支下一个tableviewsection。

我该如何解决这个问题?

更新1: 让我告诉你我的意思是“过度生长”它下面的部分:

enter image description here

enter image description here

更新2 如果我在heightForRowAtIndexPath中重新计算单元格高度,会发生这种情况。它完全透过它下面的部分而不是将它们向下移动:

enter image description here

2 个答案:

答案 0 :(得分:1)

以下代码适用于与您相同的用例,将其放在textViewDidChange中:

let size = textView.bounds.size

let newSize = textView.sizeThatFits(CGSize(width: size.width, height: CGFloat.max))
var estimatedHeight = newSize.height > MINIMUM_HEIGHT ? newSize.height : MINIMUM_HEIGHT

textView.frame = CGRectMake(0, 0, textView.frame.width, estimatedHeight)
UIView.setAnimationsEnabled(false)
tableView?.beginUpdates()
tableView?.endUpdates()
UIView.setAnimationsEnabled(true)

答案 1 :(得分:0)

您使用的是自动布局吗? 使用自动布局和大小类时,您可以从故事板中解决问题

UITextView约束设置:

  1. 设置左,右,上,下边距约束
  2. 将内容压缩阻力的优先级从750更改为900或高于750,内容拥抱优先级为250 t0 260.
  3. 关闭滚动功能。 enter image description here

    此外,您必须在textViewDidChange(textView: UITextView)方法

    中添加以下行

    tableView?.beginUpdates() tableView?.endUpdates()

  4. 然后应该工作!