Странное поведение UITextView (исключение Snaphotting)

#ios #swift

#iOS #swift

Вопрос:

Итак, есть приложение, в котором у меня есть 2 текстовых представления в стековом представлении, одно для ввода, а другое для вывода (очень похоже на приложение Google Translate).

Я ограничил представление стека начальным и конечным краями представления и верхней частью safeAreaLayoutGuide (поскольку у меня есть мой VC внутри контроллера навигации). Я также изначально присвоил моим текстовым представлениям высоту 150 точек.

outputTextView изначально скрыт, и только когда я помещаю текст в inputTextView, я анимирую скрытое свойство outputTextView. То же самое происходит, когда inputTextView пуст, поэтому я скрываю outputTextView:

 func textViewDidChange(_ textView: UITextView) {
        if textView == inputTextView {
            if textView.hasText {
                UIView.animate(withDuration: 0.2) {
                    self.outputTextView.isHidden = false
                }
            } else {
                UIView.animate(withDuration: 0.15) {
                    self.outputTextView.isHidden = true
                }
            }
        }
    }
  

Затем в моем inputTextView я реализовал логику заполнения: я присвоил ему текст по умолчанию «Некоторый текст» светло-серого цвета, а затем в методах делегирования didBeginEditing и didendedediting я реализовал следующую логику:

 func textViewDidBeginEditing(_ textView: UITextView) {
        if textView.textColor == UIColor.lightGray {
            textView.text = nil
            textView.textColor = UIColor.black
        }
    }

func textViewDidEndEditing(_ textView: UITextView) {
        if textView == inputTextView amp;amp; textView.text.isEmpty {
            textView.text = "Some text"
            textView.textColor = UIColor.lightGray
        }
    }
  

В настоящее время есть 2 проблемы, над которыми я не могу разобраться:

  1. Во-первых, когда мой inputTextView имеет высоту 150, все работает нормально, но когда я меняю его высоту, скажем, на 100 баллов, я получаю следующее: inputTextView

Я решил проблему, вызвав layoutIfNeeded() в inputTextView после установки всех ограничений представления стека. Но я не совсем уверен, зачем мне это нужно, поэтому я надеюсь, что кто-нибудь сможет прояснить это для меня.

  1. Вторая проблема заключается в следующем: после нескольких циклов ввода-стирания текста внутри inputTextView текст-заполнитель, похоже, смещается вниз на пару пунктов:

плейсхолдер

В дополнение к этому, когда я выбираю свое inputTextField, я получаю это спорадическое исключение: [Snapshotting] Для создания снимка вида (0x7ff43b538ce0, UIInputSetContainerView), который не был отображен хотя бы один раз, требуется afterScreenUpdates: ДА.

Это довольно сложно уловить, иногда это происходит без ввода текста в textview, иногда после нескольких циклов ввода-стирания, но единственное, что всегда верно, это то, что это происходит при выборе TextView. Я пытался поместить некоторые layoutIfNeeded() здесь и там, но это не устранило проблемы.

Комментарии:

1. Скорее всего, причиной является ваш способ обращения с заполнителем. Возможно, вам следует использовать UILabel и хранить его отдельно вместо использования текста в UITextView. Краткий момент отсутствия текста, вероятно, также вызывает проблемы с ограничениями. У вас отключена прокрутка?

2. @agibson007 Спасибо за предложение с отдельной меткой, я попробую это, если все остальное не удастся. Что касается прокрутки, я включил ее, но ее отключение не имеет никакого эффекта.