Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 282
Brock Woolf Avatar asked Aug 14 '10 06:08

Brock Woolf


People also ask

What is NSAttributedString?

An NSAttributedString object manages character strings and associated sets of attributes (for example, font and kerning) that apply to individual characters or ranges of characters in the string. An association of characters and their attributes is called an attributed string.

What is NSMutableAttributedString?

A mutable string with associated attributes (such as visual style, hyperlinks, or accessibility data) for portions of its text.

How do you add attributed text in Swift?

First create an NSMutableAttributedString with a new font attribute. You don't use textView. text . Then append another attributed string that doesn't have any attributes set.


1 Answers

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 
like image 109
Dave DeLong Avatar answered Sep 26 '22 02:09

Dave DeLong