Несколько цветов в NSString
или NSMutableStrings
невозможны. Итак, я немного слышал о NSAttributedString
, который был представлен в iPad SDK 3.2 (или около 3.2) и доступен на iPhone с iPhone SDK 4.0 beta. .
Я хотел бы иметь строку трех цветов.
Причина, по которой я не использую 3 отдельных NSStrings, заключается в том, что длина каждой из трех NSAttributedString
подстрок часто меняется, поэтому я бы предпочел не использовать какие-либо вычисления для изменения положения 3 отдельных Объекты NSString
.
Если это возможно с помощью NSAttributedString
, как мне сделать следующее - (если это невозможно со строкой NSAttributed, как бы вы это сделали):
Изменить:
Помните, @ "first"
, @ "second"
и @ "third"
будут заменены другими строками в любое время. Поэтому использование жестко запрограммированных значений NSRange не сработает.
При построении строк с атрибутами я предпочитаю использовать изменяемый подкласс, чтобы все было чище.
При этом, вот как вы создаете трехцветную атрибутивную строку:
NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:@"firstsecondthird"];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(5,6)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(11,5)];
набирается в браузере. предостережение разработчика
Очевидно, что вы не собираетесь жестко кодировать в таких диапазонах. Возможно, вместо этого вы могли бы сделать что-то вроде:
NSDictionary * wordToColorMapping = ....; //an NSDictionary of NSString => UIColor pairs
NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:@""];
for (NSString * word in wordToColorMapping) {
UIColor * color = [wordToColorMapping objectForKey:word];
NSDictionary * attributes = [NSDictionary dictionaryWithObject:color forKey:NSForegroundColorAttributeName];
NSAttributedString * subString = [[NSAttributedString alloc] initWithString:word attributes:attributes];
[string appendAttributedString:subString];
[subString release];
}
//display string