0

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 )

}

KDiaz
  • 37
  • 7
  • Glyph hasn’t been rendered in far away case so the text passed is nonsense? Might explain why scrolling to bottom fixes the issue. – Warren Burton Apr 10 '19 at 18:57
  • Warren - added the code to my question. Maybe you are correct since the function looks at one `rect` at a time. Not sure how to fix this issue. – KDiaz Apr 10 '19 at 19:18

0 Answers0