Używanie kalkulatora do podświetlania tekstu w widoku UITextView obejmującym wiele linii

To jest kontynuacjaUzyskiwanie CGRect dla tekstu w UITextView w celu podkreślenia za pomocą CALayer. Mam problem z uzyskaniem poprawnego prostokąta dla zakresów w każdym fragmencie linii.

NSString* searchString = @"Returns the range of characters that generated";
NSRange match = [[[self textView]text]rangeOfString:searchString];
NSRange matchingGlyphRange = [manager glyphRangeForCharacterRange:match actualCharacterRange:NULL];



[manager enumerateLineFragmentsForGlyphRange:matchingGlyphRange usingBlock:
 ^(CGRect lineRect, CGRect usedRect, NSTextContainer *textContainer, NSRange lineRange, BOOL *stop) {

     NSRange currentRange = NSIntersectionRange(lineRange, matchingGlyphRange);

     [manager enumerateEnclosingRectsForGlyphRange:currentRange withinSelectedGlyphRange:NSMakeRange(NSNotFound, 0) inTextContainer:textContainer usingBlock:
      ^(CGRect rect, BOOL* stop) {
         if (usedRect.origin.y == rect.origin.y && NSLocationInRange(currentRange.location, lineRange)) {

             CGRect theRect = [manager boundingRectForGlyphRange:currentRange inTextContainer:textContainer];

             CALayer* roundRect = [CALayer layer];
             [roundRect setFrame:theRect];
             [roundRect setBounds:theRect];

             [roundRect setCornerRadius:5.0f];
             [roundRect setBackgroundColor:[[UIColor blueColor]CGColor]];
             [roundRect setOpacity:0.2f];
             [roundRect setBorderColor:[[UIColor blackColor]CGColor]];
             [roundRect setBorderWidth:3.0f];
             [roundRect setShadowColor:[[UIColor blackColor]CGColor]];
             [roundRect setShadowOffset:CGSizeMake(20.0f, 20.0f)];
             [roundRect setShadowOpacity:1.0f];
             [roundRect setShadowRadius:10.0f];

             [[[self textView]layer]addSublayer:roundRect];
             *stop = YES;
         }
     }];
}];

To moja obecna próba. W zasadzie używam enumerateLineFragmentsForGlyphRange: usingBlock: do przechodzenia przez każdą linię. Następnie używam enumerateEnclosingRectsForGlyphRange: withinSelectedGlyphRange: usingBlock: aby upewnić się, że zakres tekstu w bieżącej linii odpowiada zakresowi linii i ma tę samą współrzędną Y. Czasami to działa, a czasami nie.

Wydaje się, że jeśli wyszukiwany tekst jest bliski powrotu, rysuje punkt wyjścia. (współrzędna y).

Na tym obrazku „Zwraca zakres wygenerowanych znaków”.

Wydaje się, że tekst nie znajduje się w pobliżu powrotu lub białych znaków działa poprawnie:

Czy czegoś mi brakuje?

AKTUALIZACJA:

Zawęziłem nieco problem, wierzę, że enumerateLineFragmentsForGlyphRange: usingBlock: pomija linie, które mają zwroty.

questionAnswers(1)

yourAnswerToTheQuestion