Ios 在禁用添加文本和滚动时,如何使UITextView字段展开?

Ios 在禁用添加文本和滚动时,如何使UITextView字段展开?,ios,xcode,Ios,Xcode,我在tableView单元格中使用UITextView来保存不同大小的文本内容,并禁用滚动 为了自动调整UITextView的大小,我使用了自动布局将其固定到布局,并添加了此方法来调整高度: override func viewWillAppear(_ animated: Bool) { tableView.estimatedRowHeight = 50 tableView.rowHeight = UITableViewAutomaticDimension } 当内容第一次

我在tableView单元格中使用UITextView来保存不同大小的文本内容,并禁用滚动

为了自动调整UITextView的大小,我使用了自动布局将其固定到布局,并添加了此方法来调整高度:

 override func viewWillAppear(_ animated: Bool) {
    tableView.estimatedRowHeight = 50
    tableView.rowHeight = UITableViewAutomaticDimension
 }
当内容第一次加载时,这在初始视图上正常工作。然而,我也希望用户能够在点击内容时编辑文本(类似于苹果的提醒应用程序)。这是正确的,但有一个限制:UITextView不会随着内容的增长而扩展

如何使UITextView在编辑过程中展开而无需滚动

新详情: 以下是当前设置的屏幕截图

根据下面Matt的建议,我创建了以下子类

class MyTextView: UITextView {

        @IBOutlet var heightConstraint : NSLayoutConstraint?
        override func awakeFromNib() {
            super.awakeFromNib()
            self.heightConstraint?.isActive = false
        }
}

我不得不修改强制展开以避免致命错误

您可以使用varsizeThatFits

override func viewDidLoad() {
    super.viewDidLoad()
    textView = UITextView()
    textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: textView.frame.size.height))
}
如何使UITextView在编辑过程中展开而无需滚动

自调整大小的文本视图非常简单;对于没有高度约束的非滚动文本视图,它是默认值。在本例中,我添加了一些代码来删除现有的高度约束,不过您可以在情节提要中通过指示高度约束是占位符来执行此操作:

class MyTextView : UITextView {
    @IBOutlet var heightConstraint : NSLayoutConstraint!
    override func awakeFromNib() {
        super.awakeFromNib()
        self.heightConstraint.isActive = false
    }
}
结果的屏幕广播:


如果随后对表视图执行批处理更新,并且假设单元格的其他内部约束正确,那么也将重新测量单元格(但我没有在示例中演示这一点)。

每个人都非常努力地帮助我解决此问题。我尝试了每一种方法,但都未能实现任何一种方法,并取得令人满意的结果

我的一位同事向我介绍了这个解决方案:经过以下修改,我的问题得以解决

    // MARK: UITextViewDelegate
    func textViewDidChange(_ textView: UITextView) {
        let startHeight = textView.frame.size.height
        let calcHeight = textView.sizeThatFits(textView.frame.size).height

        if startHeight != calcHeight {

            UIView.setAnimationsEnabled(false)
            self.tableView.beginUpdates()
            self.tableView.endUpdates()

          // let scrollTo = self.tableView.contentSize.height - self.tableView.frame.size.height
          // self.tableView.setContentOffset(CGPoint(x: 0, y: scrollTo), animated: false)

            UIView.setAnimationsEnabled(true)
        }
    }

注意:scrollTo选项导致内容向上移动了几个单元格。有了它,一切都按预期工作。

我建议使用框架,它工作得很好。这看起来可以很好地解决问题,但我想做一些本地的事情。如果没有别的办法,我就这么做。谢谢。嗨,马特,这是实时的吗?当我键入时,它会自动扩展TextView区域吗?当我将其添加到实现UITextView的TableView控制器时,我得到三个错误,第一个错误是“方法不会覆盖其超类中的任何方法”。另一个是“UITableViewController没有成员布局子视图”和“没有成员内容大小”。你能提供关于正确实现的更多见解吗?好吧,如果你把代码添加到表视图控制器中,那么你没有按照我说的做。试着读一下我说的。对不起,我的代码错了,修复了它。结果表明,默认情况下会自动调整大小;除了关闭高度约束之外,您无需执行任何操作。请参阅我上面的注释。我尝试了你所说的,它抛出了一个致命的错误,所以我删除了强制展开,并将其设置为可选。你的例子正是我想要的,所以如果我们能得到最后一点调整,它将是完美的。