Как создать символы нижнего индекса, которые не отображаются в Unicode в iOS

Я уже давно пытаюсь создать NSString с индексированным символом без успеха. Возможно ли это сделать в iOS?
Мне нужен способ изменить символы в строке на индекс или надстрочный индекс, и я не могу использовать Unicode для этого, поскольку Unicode не имеет всех букв.
Мое предположение может заключаться в использовании HTML-тегов <sub> и <sup>, но я не нашел способ конвертировать теги HTML в NSString.

Ответы

Ответ 1

Подстрочный индекс и надстрочный индекс не являются чертами характера. За некоторыми исключениями (например, ², ³, ª), это способ отображения регулярных символов - меньшим шрифтом и выше/ниже базовой линии обычных символов. Имея это в виду, вы не можете иметь "NSString с подстрочными символами", не более, чем вы можете иметь NSString с жирным или курсивом.

Таким образом, если в Юникоде не существует желаемого индексированного символа, индексы и надстроки создаются при рендеринге строки, а не при создании строки. И это не ограничение iOS, это ограничение способа обработки строк на современных компьютерах.

Что вы делаете с этим NSString? Вы показываете его на UILabel? Вы отправляете его по сети? Вы визуализируете его как HTML? Обратите внимание, что <sub> и <sup> являются тегами HTML; если NSString не интерпретируется как HTML (скажем, UIWebView), они не будут интерпретироваться как sup/superscript.

Ответ 2

Я не смог заставить NSSuperscriptAttributeName работать, но имел успех со следующим:

UILabel *label = [[UILabel alloc] init];

NSString *string = @"abcdefghi";

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:string];

NSInteger num1 = 1;
CFNumberRef num2 = CFNumberCreate(NULL, kCFNumberNSIntegerType, &num1);

[attrString addAttribute:(id)kCTSuperscriptAttributeName value:(id)num2 range:NSMakeRange(4,2)];

label.attributedText = attrString;

[attrString release];

Это дает вам: enter image description here

Присвоение атрибута String метке с помощью label.attributedText является новым с 6.0, но способ настройки атрибутивной строки может работать с более ранними версиями iOS.

Отправка отрицательного значения в kCTSuperscriptAttributeName дает вам индекс.

Не забудьте добавить структуру CoreText.

Ответ 3

Есть компонент, который может это сделать, через некоторые категории на NSString и UILabel. Хотя это может быть излишним для вашей ситуации:

NSString *stringWithTags = @"<b>Bold</b> <sup>sup</sup> <sub>sub</sub> <u>Under</u> <strike>strike</strike> <i>Italic</i> <small>small</small> <b><u>U+B</u></b>";
NSAttributedString *attributedString = [[RCTagProcessor defaultInstance] attributedStringForText:stringWithTags];

Или вы можете сразу установить текст на ярлыке:

[self.label rc_setTaggedText:stringWithTags];

https://github.com/gebeleysis/RCTagProcessing