Как создать подстрочные символы, которых нет в Unicode в iOS - PullRequest
13 голосов
/ 22 февраля 2011

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

Ответы [ 3 ]

17 голосов
/ 10 октября 2012

Я не смог заставить работать 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

Назначение атрибутивной строки для метки черезlabel.attributedText является новым с 6.0, но способ установки атрибутной строки может работать с более ранними версиями iOS.

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

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

10 голосов
/ 22 февраля 2011

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

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

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

2 голосов
/ 26 января 2015

Есть компонент, который может сделать это через некоторые категории в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...