Search code examples
iosios4nsattributedstringtextcolor

How do you use NSAttributedString?


Multiple colours in an NSString or NSMutableStrings are not possible. So I've heard a little about the NSAttributedString which was introduced with the iPad SDK 3.2 (or around 3.2) and is available on the iPhone as of iPhone SDK 4.0 beta.

I would like to have a string that has three colours.

The reason I don't use 3 separate NSStrings, is because the length of each of the three NSAttributedString substrings changes often and so I would prefer, not to use any calculations to re-position 3 separate NSString objects.

If it's possible using NSAttributedString how do I make the following - (if not possible with NSAttributed string how would you do it):

alt text

Edit: Remember, @"first", @"second" and @"third" will be replaced by other strings at any time. So using hardcoded NSRange values won't work.


Solution

  • When building attributed strings, I prefer to use the mutable subclass, just to keep things cleaner.

    That being said, here's how you create a tri-color attributed string:

    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)];
    

    typed in a browser. caveat implementor

    Obviously you're not going to hard-code in the ranges like this. Perhaps instead you could do something like:

    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