添加文本和禁用滚动时,如何获取UITextView字段以展开?

时间:2018-08-15 17:36:17

标签: ios xcode

我在tableView单元格内使用UITextView来保存大小可变的文本内容,并禁止滚动。

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

 override func viewWillAppear(_ animated: Bool) {
    tableView.estimatedRowHeight = 50
    tableView.rowHeight = UITableViewAutomaticDimension
 }

这在初始视图上正确工作-首次加载内容时。但是,我还希望用户在点击内容时能够编辑文本(类似于Apple Reminders应用程序)。这可以正常使用,但有一个限制:UITextView不会随着内容的增长而扩展。

如何在编辑过程中使UITextView展开而不滚动?

新细节: 这是当前设置的屏幕截图。

screenshot of textView settings

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

class MyTextView: UITextView {

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

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

3 个答案:

答案 0 :(得分:2)

  

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

自定尺寸的文本视图非常简单;对于没有高度限制的非滚动文本视图,这是默认设置。在此示例中,我添加了一些代码来删除现有的高度限制,尽管您可以在情节提要中仅通过指示高度限制为占位符来做到这一点:

class MyTextView : UITextView {
    @IBOutlet var heightConstraint : NSLayoutConstraint!
    override func awakeFromNib() {
        super.awakeFromNib()
        self.heightConstraint.isActive = false
    }
}

结果的截屏视频:

enter image description here

如果您随后在表视图上进行了批量更新,并且假设单元格的其他内部约束是正确的,那么单元格也会被重新测量(但在示例中我没有进行演示)。

答案 1 :(得分:0)

每个人都非常努力地尝试帮助我解决此问题。我尝试了每个,但都无法实现满意的结果。

我的一位合作伙伴将我引向这个解决方案:https://stackoverflow.com/a/36070002/152205,并进行了以下修改才能解决我的问题。

    // 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选项导致内容上移几个单元格。删除后,一切按预期进行。

答案 2 :(得分:-1)

您可以使用var sizeThatFits

override func viewDidLoad() {
    super.viewDidLoad()
    textView = UITextView()
    textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: textView.frame.size.height))
}