如何根据其中的UITextView大小调整UITableViewCell的大小?

时间:2018-04-20 01:45:34

标签: ios swift uitableview uitextview nslayoutconstraint

我需要能够根据表格视图单元格中UITextView对象的高度从单元格内调整UITableViewCell的大小。当用户在文本视图中键入更多字符时,文本视图的高度需要增加,并且表格视图单元格的高度也需要增加,以适应文本视图的高度。我需要在没有UITableView.reloadData()的情况下执行此操作,因为当用户在其中键入更多字符时,我需要文本视图保留第一响应者。

我尝试过使用NSLayoutConstraint.deactivate( :),NSLayoutConstraint.activate( :),contentView.updateConstraints(),contentView.updateConstraintsAsNeeded(),contentView.setNeedsUpdateConstraints(),contentView.layoutIfNeeded( )和UITextView.sizeToFit(),对文本视图的高度和contentView的约束有不同的组合。

我还没有工作。

我包含了我的表视图单元子类的代码。我在我尝试了所有代码的地方发表评论。

    import UIKit

    class TableViewCell: UITableViewCell {

        @IBOutlet weak var textView: UITextView!

        override func awakeFromNib() {
            super.awakeFromNib()

            textView.delegate = self
            textView.textContainer.lineBreakMode = .byWordWrapping
            textView.isScrollEnabled = false

        }

    }

    extension TableViewCell: UITextViewDelegate {

        func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {

            // !!! I tried the code here !!!

            return true

        }

    }

在表格视图控制器中,我有以下代码:

        override func viewDidLoad() {
            super.viewDidLoad()

            tableView.rowHeight = 44
            tableView.rowHeight = UITableViewAutomaticDimension
            tableView.estimatedRowHeight = 44

        }

当我使用UITableView.reloadData()时,我可以让表格视图单元格调整大小,但我不能让它工作。

我已经查看了StackOverflow上的其他问题,但还没有找到解决方案。

这有帮助

How do I resize a UITableViewCell according to the size of a UITextView subView?

但它以一种不是预期方式解决问题。我怀疑Apple打算解决这个问题的方式与我尝试过的其他方法有关,即使用约束。

我希望有人知道如何做我想做的事。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

由于您已关闭textviewTableViewCell的滚动行为,因此您可以在代理时调用view controller代表,并在文字更改时调用该代理。

 protocol TextFieldUpdateDelegate {
     func textFieldDidChangeText(_ textview: UITextView)
 }

现在在视图控制器的委托一致性中。

func textFieldDidChangeText(_ textView: UITextView) {
     tableView.beginUpdate()
     tableView.endUpdate()
}

根据docs

  

您也可以使用此方法,然后使用endUpdates()方法为行高的更改设置动画,而无需重新加载单元格。

这应该根据textView中包含的文本更新tableview单元格的高度。