Прежде всего, вам не нужно устанавливать высоту для родителя textView. Даже если вы установите низкий приоритет для родителя textView.
См. Изображение, фиолетовый - родитель, желтый - textView.
В viewDidLoad добавьте следующий код:
textView.textContainerInset = UIEdgeInsets.zero
textView.textContainer.lineFragmentPadding = 0
Затем реализуйте метод делегата textView:
extension ViewController : UITextViewDelegate {
func textViewDidChange(_ textView: UITextView) {
let textHeight = textView.attributedText.boundingRect(with:
CGSize.init(width: textView.frame.width, height: .infinity),
options:[.usesLineFragmentOrigin, .usesFontLeading],
context: nil).height
if previousHeight != textHeight {
previousHeight = textHeight
print("Height text: \(textHeight)")
textViewHeight.constant = textHeight
self.view.layoutIfNeeded()
textView.setContentOffset(.zero, animated: false)
}
}
}
textViewHeight - ограничение высоты textView.
Инициализируйте var previousHeight = CGFloat(0)
как переменную экземпляра. Это поможет ограничить вызовы layoutIfNeeded только при изменении высоты.
Нижнее ограничение textView расширит родительское представление. Так что вам также не нужно устанавливать высоту Родителя.