it-swarm.com.ru

Изменить атрибуты подстрок в NSAttributedString

Этот вопрос может быть дубликатом этот . Но ответы не работают для меня, и я хочу быть более конкретным.

У меня есть NSString, но мне нужна NS(Mutable)AttributedString, и некоторые слова в этой строке должны иметь другой цвет. Я попробовал это:

NSString *text = @"This is the text and i want to replace something";

NSDictionary *attributes = @ {NSForegroundColorAttributeName : [UIColor redColor]};
NSMutableAttributedString *subString = [[NSMutableAttributedString alloc] initWithString:@"AND" attributes:attributes];

NSMutableAttributedString *newText = [[NSMutableAttributedString alloc] initWithString:text];

newText = [[newText mutableString] stringByReplacingOccurrencesOfString:@"and" withString:[subString mutableString]];

«И» должно быть в верхнем регистре красным.

В документации сказано, что mutableString хранит сопоставления атрибутов. Но с моей заменяющей вещью у меня больше нет attribuString в правой части назначения (в последней строке моего фрагмента кода).

Как я могу получить то, что я хочу? ;)

16
mjay

@ Ответ Гиперлорда сработает, но только в том случае, если во входной строке есть одно слово «и». В любом случае, я бы использовал сначала stringByReplacingOccurrencesOfString: из NSString, чтобы заменить каждое «и» на «И», затем использовать небольшое регулярное выражение для обнаружения совпадений в приписанной строке и применить NSForegroundColorAttributeName в этом диапазоне. Вот пример:

NSString *initial = @"This is the text and i want to replace something and stuff and stuff";
NSString *text = [initial stringByReplacingOccurrencesOfString:@"and" withString:@"AND"];

NSMutableAttributedString *mutableAttributedString = [[NSMutableAttributedString alloc] initWithString:text];

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(AND)" options:kNilOptions error:nil];


NSRange range = NSMakeRange(0,text.length);

[regex enumerateMatchesInString:text options:kNilOptions range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {

    NSRange subStringRange = [result rangeAtIndex:1];
    [mutableAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:subStringRange];
}];

И наконец, просто примените атрибутивную строку к вашему ярлыку.

[myLabel setAttributedText:mutableAttributedString];
35
Mick MacCallum

Я думаю, что вы должны создать NSMutableAttributedString, используя существующую NSString, а затем добавить атрибуты стиля с соответствующим NSRange, чтобы раскрасить части, которые вы хотите подчеркнуть, например:

NSString *text = @"This is the text and i want to replace something";
NSMutableAttributedString *mutable = [[NSMutableAttributedString alloc] initWithString:text];
[mutable addAttribute: NSForegroundColorAttributeName value:[UIColor redColor] range:[text rangeOfString:@"and"]];

Знай: это только из моей головы и совсем не проверено ;-)

17
hyperlord

Пожалуйста, попробуйте этот код в Swift 2 

var someStr = "This is the text and i want to replace something"
    someStr.replaceRange(someStr.rangeOfString("and")!, with: "AND")

    let attributeStr = NSMutableAttributedString(string: someStr)
    attributeStr.setAttributes([NSForegroundColorAttributeName: UIColor.yellowColor()], range: NSMakeRange(17, 3) )
    testLbl.attributedText = attributeStr
0
Masa S-AiYa

Вот еще одна реализация (в Swift), которая полезна, если вы делаете более сложные манипуляции (например, добавление/удаление символов) с вашей приписанной строкой:

let text = "This is the text and i want to replace something"
let mutAttrStr = NSMutableAttributedString(string: text)

let pattern = "\\band\\b"
let regex = NSRegularExpression(pattern: pattern, options: .allZeros, error: nil)

while let result = regex!.firstMatchInString(mutAttrStr.string, options: .allZeros, range:NSMakeRange(0, count(mutAttrStr.string)) {
    let substring = NSMutableAttributedString(attributedString: mutAttrStr.attributedSubstringFromRange(result.range))

    // manipulate substring attributes here
    substring.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range NSMakeRange(0, count(substring.string))

    mutAttrStr.replaceCharactersInRange(result.range, withAttributedString: substring)
}

Ваша последняя строка должна быть:

let finalAttrStr = mutAttrStr.copy() as! NSAttributedString
0
ocwang