Я боролся с индексами / надстрочными индексами в NSMutableAttributedString некоторое время, потому что самые основные решения требуют ввода NSRange для каждого символа, который вы хотите подписать. Конечно, есть более автоматический способ делать вещи?
Ну, да, есть, но это требует немного работы.
Мой метод состоит в том, чтобы указывать символы, которые подписаны, надстрочные знаки, выделены курсивом и т. Д. В строке NSS, заключая текст, который должен быть изменен, в знаки%, после чего следует информация о том, какой тип регулировки шрифта следует выполнить, например, «Сила на вторую частицу определяется как f-subscript-b», в моей схеме было бы написано: «Сила на вторую частицу определяется как f% & sb%».
Затем я использую удобный метод:
NSArray *substrings = [string componentsSeparatedByString:@"%"];
для разбиения строки на подстроки, разделенные знаками%, например,
@ "Привет% и как ты%?" -> массив, содержащий элементы: @ "Hello", @ "& Bhow are", @ "you?"
Затем я проверяю первый символ каждого элемента массива, чтобы увидеть, содержит ли он знак &, который я использую для обозначения того, что следующий символ будет либо B = полужирный, S = верхний индекс, I = курсив и т. Д.
Итак, в приведенном выше примере подстрока @ "& Bhow are" предназначена для преобразования в полужирную строку " Как дела " и входные данные @ "Hello% & Bhow являются% you? " предназначен для преобразования в «Привет Как дела Вы?».
Все модификации шрифта выполняются с использованием NSMutableAttributedString и связанных с ним методов, и, наконец, все подстроки NSMutableAttributedString могут быть вставлены обратно вместе, используя такие методы, как 'appendAttributedString'.
Если кому-то интересно, мой код выглядит следующим образом:
-(void) appendFontString:(NSMutableAttributedString*) attribString
:(NSString*) string{
NSArray *substrings = [string componentsSeparatedByString:@"%"];
for(int i=0;i<(int) [substrings count];i++){
if([substrings[i] length]>0){
NSString* firstCharacter=[substrings[i] substringToIndex:1];
if([firstCharacter isEqualToString:@"&"]){
NSString* fontType=[substrings[i] substringWithRange:NSMakeRange(1, 1)];
//remove first two characters
NSString* newSubString=[substrings[i] substringFromIndex:2];
if([fontType isEqualToString:@"S"]){
[self appendWithSuperscript:attribString :newSubString];
} else if([fontType isEqualToString:@"s"]){
[self appendWithSubscript:attribString :newSubString];
} else if([fontType isEqualToString:@"B"]){
[self appendWithBold:attribString :newSubString];
} else if([fontType isEqualToString:@"I"]){
[self appendWithItalics:attribString :newSubString];
}
} else{
//regular string
[self append:attribString :substrings[i]];
}
}
}
}
где методы appendWithBold и т. Д. Являются пользовательскими методами, которые преобразуют строку NSString в форматированный жирный шрифт / надстрочный / подписанный / и т. Д. NSMutableAttributedString, а затем добавьте его в переменную attribString.
Мой метод может быть не самым лучшим, но, по крайней мере, он демонстрирует, что, немного поработав, вы можете автоматизировать подписку и суперскрипт в Какао.