UITextView не печатает текст на следующей линии? - PullRequest
0 голосов
/ 15 мая 2019

Я поместил UITextView в UIView.UIView расширяется по мере того, как пользователь печатает в UITextView, но проблема в том, что если пользователь печатает на следующей строке, он не показывает набираемый текст до тех пор, пока пользователь не наберет на третьей строке, тогда он показывает текст, напечатанный навторая линия.То же самое касается 3-й и 4-й строк и т. Д.

Как это исправить?

func textViewDidChange(_ textView: UITextView) {
    print(textView.text)
    let size = CGSize(width: prayerRequest.frame.width, height: .infinity)

    let estimatedSize = textView.sizeThatFits(size)
    textView.constraints.forEach { (constraints) in
        if constraints.firstAttribute == .height {
            constraints.constant = estimatedSize.height

        }

        viewContainer.constraints.forEach({ (constraints) in
            if constraints.firstAttribute == .height {
                constraints.constant = estimatedSize.height
                viewContainer.layoutIfNeeded()
            }
        })
    }

}

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Прежде всего, вам не нужно устанавливать высоту для родителя textView. Даже если вы установите низкий приоритет для родителя textView.

См. Изображение, фиолетовый - родитель, желтый - textView.

enter image description here

В 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 расширит родительское представление. Так что вам также не нужно устанавливать высоту Родителя.

0 голосов
/ 15 мая 2019

Если вы используете конструктор интерфейса, попробуйте установить количество строк равным 0.

Или из кода textView.textContainer.maximumNumberOfLines = 10

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...