Anyone experience an issue with contentOffset
when using it to scroll to a rect
of a string in a UITextView
but the view does not scroll at all? It is as if contentOffset
does not know what to do with the rect
passed to it. This error ocurrs only when there is significant vertical distance between two rect
values relative to the contentsize.height
of the UITextView
. Otherwise, contentOffset
works fine: it will scroll the view to each rect
value passed to contentOffset
. I am using layoutManager
to get the rect
of the glyph to pass into contentOffset
.
The problem appears to be corrected if I first manually scroll to the bottom of the view and then execute contentoffset
. I am not sure why first scrolling to the bottom of the UITextView
corrects the error.
My original post did not include the code which is executed when pressing button. The function receives one NSRange at a time. The NSRange values are stored in an array and the button increments to each NSRange value and converts into a rect
.
// 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)
//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)
})
}, completion: nil )
}