Как создать символы нижнего индекса, которые не отображаются в 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