Использование CALayer для выделения текста в UITextView, который занимает несколько строк
Это продолжениеПолучение CGRect для текста в UITextView с целью выделения с помощью CALayer, Я'У меня возникли проблемы с получением правильного прямоугольника для диапазонов в каждом фрагменте строки.
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;
}
}];
}];
Это моя нынешняя попытка. Я'м в основном используя enumerateLineFragmentsForGlyphRange: usingBlock: для циклического прохождения каждой строки. Затем я'используя enumerateEnclosingRectsForGlyphRange: WithinSelectedGlyphRange: usingBlock: чтобы убедиться, что диапазон текста в текущей строке совпадает со строкой 's диапазон и имеет ту же координату Y. Иногда это работает, а иногда нетт.
Кажется, что если текст поиска находится рядом с возвратом, он выделяет основной момент. (координата у).
На этом скриншотеВозвращает диапазон сгенерированных символов должен быть выделен.
Кажется, если текст не рядом с возвратом или пробелом, это работает правильно:
Я что-то пропустил?
UPDATE: Я
Я немного сузил проблему, я считаю, enumerateLineFragmentsForGlyphRange: usingBlock: пропускает строки, которые возвращают.