Вычислить границы запуска глифа с помощью NSLayoutManager

Я пытаюсь добиться визуального эффекта с помощью UITextView, при котором текст имеет отдельный цвет фона, например:

Пример текстового эффекта

Подход, который я пытался использовать, был основан на фрагменте кода Apple, используемом для расчета строк, а затем построен на основе, как показано на этом пример для расчета рамок строк, например:

NSLayoutManager *layoutManager = [textView layoutManager];
NSString *string = textView.text;
NSInteger numberOfLines, index, stringLength = [string length];

NSMutableArray *ranges = [[NSMutableArray alloc] init];
NSMutableArray *frames = [[NSMutableArray alloc] init];
for (index = 0, numberOfLines = 0; index < stringLength; numberOfLines++)
{
    NSRange tempRange;
    NSRange range = [string lineRangeForRange:NSMakeRange(index, 0)];
    CGRect rect = [layoutManager lineFragmentRectForGlyphAtIndex:index
                                       effectiveRange:&tempRange];

    [ranges addObject:[NSValue valueWithRange:range]];

    [frames addObject:[NSValue valueWithCGRect:rect]];
    NSMaxRange(tempRange);
}

Затем я беру рамки и рисую прямоугольники. Этот и подобные подходы, которые я пробовал, имеют общую проблему: кадры строк, которые я вычисляю, содержат конечные пробелы, и я не уверен, как их обрезать (а также поддерживать правильный поток текста).

Я беспокоюсь, что могу слишком много думать об этом. Есть ли более простой способ?


person isaac    schedule 20.01.2017    source источник
comment
Вот загружаемый пример проекта, который может вам помочь: github.com/mattneub/Programming-iOS-Book-Examples/blob/master/ Он рисует рамку вокруг нажатой линии, удаляя пробел (символ возврата) в конце. Это не так сложно, как то, что вы пытаетесь сделать, но это может помочь.   -  person matt    schedule 20.01.2017
comment
Это исходный код? index остается нетронутым, а возвращаемое значение NSMaxRange не используется. Однако вы получаете диапазон глифов макета в tempRange. Просто взгляните на строку, если есть пробелы, удалите их и перекомпонуйте (частичную) строку. (Кстати: глифы и символы не обязательно имеют отношение 1 к 1.)   -  person Amin Negm-Awad    schedule 20.01.2017
comment
Вы поняли это?   -  person Joseph Francis    schedule 09.12.2017