用户输入搜索词并生成匹配表。用户可以选择一行以查看UITextView中显示的详细文本。在详细文本视图中,可以点击一个增量按钮来循环显示匹配的文本。该按钮前进一个索引,该索引增加NSRange值数组的索引,这些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 )
}