Пользователь вводит поисковый запрос и генерирует таблицу совпадений. Пользователь может выбрать строку для просмотра подробного текста, отображаемого в UITextView. В подробном текстовом представлении можно нажимать кнопку инкремента, чтобы циклически проходить через сопоставленный текст. Кнопка продвигает индекс, который увеличивает индексы массива значений NSRange, которые представляют местоположение совпадающего текста в UITextView. При нажатии на кнопку инкремента contentOffset используется для прокрутки пользователя до соответствующего текста в UITextView. В то же время существует прямоугольник с закругленными углами, который перемещается вместе с анимацией contentOffset. Округленное прямоугольное представление обводит сопоставленный текст в виде визуальной подсказки, указывающей, какой сопоставленный текст идентифицирован.
Функция анимации вставлена ниже. Анимация работает почти идеально. Однако, если между каждым сопоставленным текстовым диапазоном имеется большой объем текста, функция contentOffset не прокручивает до совпадения, и представление с закругленными прямоугольниками перемещается в неверное место в UITextView. Если я несколько раз нажму на кнопку инкремента, анимация исправит себя, и и contentOffset, и анимированный прямоугольник с закругленными углами идеально подойдут к сопоставленному тексту. Я также могу исправить проблему, если я нажму на ссылку и вернусь к подробному виду.
Есть мысли о том, как исправить эту проблему?
// called when button pressed.
func matchProcessing(matchRange:NSRange, InTextView textView:UITextView){
// unhide the rounded rectangle view that will circle matched text
self.detailText.viewWithTag(1)?.isHidden = false
//get rect of NSRange of matched text
let matchTxtRect = textView.layoutManager.boundingRect(forGlyphRange: matchRange, in: textView.textContainer)
self.view.layoutIfNeeded()
//animation of scroll and rounded rectangle view
UIView.animate(withDuration: 0.8, delay: 0.0, options: .curveEaseInOut, animations:
{
textView.contentOffset = CGPoint(x: 0.0, y: matchTxt.origin.y)
// get rect of
let nextDestination = self.frameOfTextInRange(range: self.arrayOfMatches[self.matchIndex], inTextView: textView)
//this does not work either: let nextDestination = textView.layoutManager.boundingRect(forGlyphRange: self.arrayOfMatches[self.matchIndex], in: textView.textContainer)
let destination = textView.viewWithTag(1)?.convert(textView.viewWithTag(1)!.center, from: textView.viewWithTag(1)?.superview)
textView.viewWithTag(1)?.move(to: (destination?.applying(
CGAffineTransform(translationX: nextDestination.origin.x, y: nextDestination.origin.y)))!,
duration: 0.8,
options: .curveEaseInOut)
UIView.animate(withDuration: 0.6, delay:0, options: [.repeat, .autoreverse, .curveEaseInOut], animations: {
self.detailText.viewWithTag(1)?.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
self.view.layoutIfNeeded()
})
}, completion: nil )
}