我的应用程序实现了搜索功能,该功能可以过滤类数据对象并将结果传递到UITextView。匹配的搜索文本具有颜色属性。下面的函数检查从搜索中收集的NSRange值数组中最后一个索引的rect,并测试最后一个索引的rect是否位于UITextView的bounds.height内。如果该函数返回false,则显示一个增量按钮,以允许用户迭代位于UITextView范围之外的搜索匹配项。搜索文本可能很长,因此增量器功能很有用。
该功能似乎在99%的时间内都有效。但是,在测试期间,当最后一个索引匹配的rect在边界之内时,该函数返回true。UITextView BUT 的高度视觉检查显示匹配的文本超出了UITextView的边界,即,必须向下滚动才能看到它。
我不明白为什么在1%的时间内,匹配的搜索文本的矩形在视觉上超出了UITextView的边界,但是布局管理器却提供了匹配的搜索文本的矩形,其小于UITextView的边界高。显然我缺少了一些东西。我认为布局管理器边界rect函数是在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
}