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

У меня есть 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 добавляет больше пробела для позиционирования совпавшего текста в середине представления.Ни один результат не желателен.Я могу жить с последним, но первый бесполезен, потому что он прокручивает первый подобранный текст вне поля зрения.

Я искал похожую проблему с переполнением стека, но не могу ее найти.Если оно существует, пожалуйста, укажите на это.Если нет, то любое предложение приветствуется.

1 Ответ

0 голосов
/ 25 марта 2019

Это похоже на работу:

if rect.minY >= detailText.frame.height/2 {

self.detailText.scrollRectToVisible(rect.offsetBy(dx: 0.0, dy: detailText.frame.height/2), animated: true)

}

...