2016-10-14 2 views
0

Мне нужно проверить NSMutableString со значениями, которые я вставил, когда он первоначально был NSString.Измените атрибуты нескольких частей NSMutableAttributedString

Примером этого является:

NString* textToDraw = @""; 
textToDraw = [textToDraw stringByAppendingString:[[NSString alloc] initWithFormat:@"  
Summary of currently worked on process\n\nTitle name:\nResults for Process\n %@\n%@\n%@\n, resultOne, resultTwo, resultThree]]; 

resultOne, resultTwo, resultThree просто обычные NSString значения

Я тогда инициализацию NSMutableAttributedString для некоторых добавили форматирование.

NSMutableAttributedString *summaryBody = [[NSMutableAttributedString alloc] initWithString:textToDraw]; 

CTFontRef centuryGothicStandard; 
CTFontRef centuryGothicTitle; 

centuryGothicStandard = CTFontCreateWithName(CFSTR("Century Gothic"), 12.0, nil); 
centuryGothicTitle = CTFontCreateWithName(CFSTR("Century Gothic-Bold"), 24.0, nil); 

//Modify the summary, so that the title is larger, and bolded, the subtitles are bolded, and the text is century gothic font 
[summaryBody addAttribute:(id)kCTFontAttributeName 
        value:(__bridge id)centuryGothicStandard 
        range:NSMakeRange(0, [summaryBody length])]; 

Что мне нужно сделать, это изменить resultOne, resultTwo и resultThree быть красными, я попытался ответившим решением в Change attributes of substrings in a NSAttributedString, но я не понимаю концепции.

Могу ли я просто пропустить NSMutableAttributedString и найти конкретный символ, который я вставляю, скажем '|' для начальной точки и «?» для конечной точки? Я искал получение определенного индекса, но ничего не связанного с NSAttributedMutatableString всплывает только NSRange, о котором я не буду знать конкретно.

Вот некоторые псевдо-код, чтобы помочь объяснить, что я думаю, что может быть возможным решением:

textToDraw = [textToDraw stringByAppendingString:[[NSString alloc] initWithFormat:@" Summary of currently worked on process\n\nTitle name:\nResults for Process\n |%@?\n|%@?\n|%@?\n, resultOne, resultTwo, resultThree]]; 
(for int i = 0; i < [NSAttributedMutatableString length]; i++) 
{ 
    if(char at i == '|') 
    { 
     get an NSRange from this value to the char at i == '?' 
     [NSAttributedMutatableStringS addAttribute:(id)kCTForegroundColorAttributeName 
        value:(id)[UIColor redColor].CGColor 
        range:NSMakeRange(0, NSRangeAbove])]; 
    } 
} 

В настоящее время я могу получить значения resultOne и такие, и создать NSAttributedStrings с дополнительным атрибутом изменения цвета, единственная проблема, конечно, не зная значения индекса, так что это еще одна возможность.

ответ

0

Поиск начала символов конца или последовательности символов в порядке, если вы уверены, что они никогда не будут появляться в строках resultX ...

Один подход должен был бы построить строку по кусочкам и создать массив диапазонов на лету. В конце вы просто нажимаете на них атрибуты.

NSMutableString *mTextToDraw = [[NSMutableString alloc] init]; 
NSMutableArray *mRangesToMod = [[NSMutableArray alloc] init]; 
NSValue *mRange = nil; 

[mTextToDraw appendFormat:@"Summary of currently worked on process\n\nTitle name:\nResults for Process\n "]; 

mRange = [NSValue valueWithRange:NSMakeRange(mTextToDraw.length,resultOne.length)];; 
[mRangesToMod addObject: mRange]; 
[mString appendFormat:@"%@\n",resultOne]; 

mRange = [NSValue valueWithRange:NSMakeRange(mTextToDraw.length,resultTwo.length)];; 
[mRangesToMod addObject: mRange]; 
[mString appendFormat:@"%@\n",resultTwo]; 

mRange = [NSValue valueWithRange:NSMakeRange(mTextToDraw.length,resultThree.length)];; 
[mRangesToMod addObject: mRange]; 
[mString appendFormat:@"%@\n",resultThree]; 

NSMutableAttributedString *summaryBody = [[NSMutableAttributedString alloc] initWithString:mTextToDraw]; 

for (NSValue *vRange in mRangesToMod) 
{ 
    NSRange range = vRange.rangeValue; 

    [summaryBody setAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"Roboto-Light" size:smallFont]} 
         range:range]; 

    // or you can use addAttribute... 
} 

Я использовал «Roboto-Light» в своем приложении - он не будет работать на вашем, как есть. Как пример. Для теста просто поставьте там какой-нибудь шрифт, а затем основной (оригинальный) один ...

+0

Спасибо, что, отвечая на мой вопрос, я должен проверить это, когда у меня появится такая возможность. –

+0

Я протестировал ваш ответ и могу с радостью сказать, что он работает: D, я очень ценю помощь! –

+0

Добро пожаловать! –

Смежные вопросы