#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 проблемы, над которыми я не могу разобраться:
- Во-первых, когда мой inputTextView имеет высоту 150, все работает нормально, но когда я меняю его высоту, скажем, на 100 баллов, я получаю следующее:
Я решил проблему, вызвав layoutIfNeeded() в inputTextView после установки всех ограничений представления стека. Но я не совсем уверен, зачем мне это нужно, поэтому я надеюсь, что кто-нибудь сможет прояснить это для меня.
- Вторая проблема заключается в следующем: после нескольких циклов ввода-стирания текста внутри inputTextView текст-заполнитель, похоже, смещается вниз на пару пунктов:
В дополнение к этому, когда я выбираю свое inputTextField, я получаю это спорадическое исключение: [Snapshotting] Для создания снимка вида (0x7ff43b538ce0, UIInputSetContainerView), который не был отображен хотя бы один раз, требуется afterScreenUpdates: ДА.
Это довольно сложно уловить, иногда это происходит без ввода текста в textview, иногда после нескольких циклов ввода-стирания, но единственное, что всегда верно, это то, что это происходит при выборе TextView. Я пытался поместить некоторые layoutIfNeeded() здесь и там, но это не устранило проблемы.
Комментарии:
1. Скорее всего, причиной является ваш способ обращения с заполнителем. Возможно, вам следует использовать UILabel и хранить его отдельно вместо использования текста в UITextView. Краткий момент отсутствия текста, вероятно, также вызывает проблемы с ограничениями. У вас отключена прокрутка?
2. @agibson007 Спасибо за предложение с отдельной меткой, я попробую это, если все остальное не удастся. Что касается прокрутки, я включил ее, но ее отключение не имеет никакого эффекта.