UITextView在UITableViewCell上的动态改变高度

效果图

Dec-04-2019 16-40-11.gif

一开始就是想着在用户每次输入完一个字符的时候,都去计算一下高度。
我使用的是textView的textViewDidChange这个代理方法。

func textViewDidChange(_ textView: UITextView) {

        print(textView.text)

        self.textViewHeight = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat(MAXFLOAT))).height
        if self.textViewHeight < 20 {
            self.textViewHeight = 20
        }
        self.delegate?.textInputHeightChange(height: textViewHeight, text: textView.text , cell : self)
    }

然后在外层代理调用,刷新列表方法进行刷新

self.prescriptionListTableView?.reloadRows(at: [IndexPath(row: 0, section: 0)], with: .none)

我在改变高度之后,外部刷新tableView用的是reloadRows方法,本来是没有什么问题的,然后我就开开心心提测了。
然后就悲剧了:(

悲剧原因就是,因为测试手机装的输入法是iOS自带的输入法,iOS原生输入法,和其他输入法不一样的是的地方就是在输入中文的时候,会把正在输入的汉字的拼音先录入到输入框中,这就导致了,输入进输入框的全是汉语拼音。

原因是,在reloadRows的时候,tableView会走一遍cellForRow的代理方法,对textView进行了重新赋值
解决方法:不用reloadRows进行刷新,改为

self.prescriptionListTableView?.beginUpdates()
self.prescriptionListTableView?.endUpdates()

这种刷新方式tableView会只调用heightForRow的代理,而不会走cellForRow的代理方法:)

你可能感兴趣的:(UITextView在UITableViewCell上的动态改变高度)