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):
Edit: Remember, @"first"
, @"second"
and @"third"
will be replaced by other strings at any time. So using hardcoded NSRange values won't work.
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.
A mutable string with associated attributes (such as visual style, hyperlinks, or accessibility data) for portions of its text.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With