У меня есть UiTextView, который я использую для отображения подробного текста.Иногда текст может быть достаточно длинным, чтобы пролистать его.Иногда текст может быть достаточно коротким, чтобы он помещался в рамку UITextView.
Я также реализую функцию поиска, которую можно использовать для поиска более длинных текстовых строк.Функция добавляет атрибут цвета шрифта к тексту, соответствующему строке ввода поиска.Функция собирает массив значений NSRange для каждого ввода соответствующей строки поиска.Я использую регулярное выражение, чтобы сопоставить строку поиска и вернуть массив значений NSRange для каждого совпадения.
В настоящее время я разрабатываю функцию, которая анимирует пользователя в позицию UITextView соответствующей строки поиска.
Позже я предоставлю кнопку, по которой пользователь может нажимать для циклического просмотра совпадений.
Пока все работает очень хорошо.Смотрите код ниже. detailText - это UITextView:
// rangeOfSearchText uses a regex to return the range of the match. For text purposes, the function returns the first index only.
let rangeOfMatch = rangeOfSearchText(searchString: self.searchText!, UIText: self.detailText.text)
let glyRange = self.detailText.layoutManager.glyphRange(forCharacterRange: rangeOfMatch, actualCharacterRange:nil)
let rect = self.detailText.layoutManager.lineFragmentRect(forGlyphAt: NSMaxRange(glyRange), effectiveRange: nil)
self.detailText.scrollRectToVisible(rect, animated: true)
Хотя код работает хорошо, сопоставленный текст отображается внизу результирующего фрейма UITextView.Я хочу, чтобы подобранный текст отображался в середине представления.Я попробовал следующий фрагмент кода, который вроде работает:
self.detailText.contentOffset.y = 200
contentOffset работает так, как задумано, только если диапазон совпадающего текста находится в середине большой многострочной строки.Если сопоставляемый текстовый диапазон находится в начале строки, реализация contentOffset прокручивает пользователя мимо сопоставленного текста на 200. По сути, сопоставленный текст прокручивается вне поля зрения.Это не хорошо.Если совпавший текст находится в конце многострочного текста, contentOffset добавляет больше пробела для позиционирования совпавшего текста в середине представления.Ни один результат не желателен.Я могу жить с последним, но первый бесполезен, потому что он прокручивает первый подобранный текст вне поля зрения.
Я искал похожую проблему с переполнением стека, но не могу ее найти.Если оно существует, пожалуйста, укажите на это.Если нет, то любое предложение приветствуется.