Мое приложение реализует функцию поиска, которая фильтрует объект данных класса и передает результаты в UITextView. Соответствующий текст поиска получает атрибут цвета. Приведенная ниже функция проверяет прямоугольник последнего индекса в массиве значений NSRange, собранных в результате поиска, и проверяет, находится ли прямоугольник последнего индекса в пределах bounds.height UITextView. Если функция возвращает false, я показываю кнопку инкремента, чтобы позволить пользователю перебирать результаты поиска, расположенные за пределами UITextView. Текст для поиска может быть длинным, поэтому полезна функция инкремента.
Эта функция работает 99% времени. Однако во время тестирования функция вернула значение true, когда прямоугольник последнего совпадения индекса находится в пределах границ. Высота визуального контроля UITextView НО показывает, что сопоставленный текст находится за пределами границ UITextView, т. Е. Один надо прокрутить вниз, чтобы увидеть это.
Я не понимаю, почему в 1% случаев прямоугольник сопоставленного текста поиска визуально находится за пределами границ UITextView, но менеджер компоновки обеспечивает прямоугольник сопоставленного текста поиска, который меньше высоты границ UITextView. Я явно что-то упускаю. Я думал, что ограничивающая прямоугольная функция менеджера компоновки - это способ получить запись глифа в UITextView.
func testForRectLocationOfLastMatch(arrayOfMatches:[NSRange], InTextView textView:UITextView) -> Bool{
var rectOfLastIndex:CGRect = CGRect(x: 0, y: 0, width: 0, height: 0)
//get last value in array of ranges
if let lastIndexMatch = arrayOfMatches.last {
//get CGrect of the range
rectOfLastIndex = textView.layoutManager.boundingRect(forGlyphRange: lastIndexMatch, in: textView.textContainer)
}
if rectOfLastIndex.maxY <= textView.bounds.height.rounded() {
return false
}
return true
}