TheBlueTurtle
TheBlueTurtle

Reputation: 117

In UILabel, multiple strings with multiple colors for each string?

In my UILabel, I want to put 3 strings with 3 different colors. One specific color for each string.

But I don’t want to use the NSRange (counting the number of characters). I would find a solution which change the color of the entire string, whatever his length.

For example : let's say firstString is blue, the secondString is green and the thirdString is red.

var firstString: [String] = "hello how"
var secondString: [String] = "are you"
var thirdString: [String] = "buddy?"

myLabel.text = "\(firstString) \(secondString) \(thirdString)"

with this OUTPUT :

enter image description here

Upvotes: 3

Views: 166

Answers (1)

Larry Pickles
Larry Pickles

Reputation: 4646

this, but this is an NSMutableAttributedString, you'll have to figure out how to work with these, however, whatever you are using this string for, you will most like have something exposed from the super class header that exposes an AttributedText property where you would assign this property the value of "myString1" and then you WOULD NOT supply a value for the "text" property.

var myString1 = NSMutableAttributedString(string:"hello how are you buddy")


let myString1Font1 = UIFont(name:"AvenirNext-Regular", size:24.0)


let myString1Color1 = UIColor(red: 0.292745, green: 0.461693, blue: 0.998524, alpha: 1.000000)
let myString1Color2 = UIColor(red: 0.000000, green: 0.176471, blue: 0.600000, alpha: 1.000000)
let myString1Color3 = UIColor(red: 0.333333, green: 0.556863, blue: 0.156863, alpha: 1.000000)
let myString1Color4 = UIColor(red: 0.643137, green: 0.031373, blue: 0.000000, alpha: 1.000000)


var myString1ParaStyle1 = NSMutableParagraphStyle()
myString1ParaStyle1.alignment = NSTextAlignment.Center



myString1.addAttribute(NSParagraphStyleAttributeName, value:myString1ParaStyle1, range:NSMakeRange(0,9))
myString1.addAttribute(NSUnderlineColorAttributeName, value:myString1Color1, range:NSMakeRange(0,9))
myString1.addAttribute(NSFontAttributeName, value:myString1Font1!, range:NSMakeRange(0,9))
myString1.addAttribute(NSForegroundColorAttributeName, value:myString1Color2, range:NSMakeRange(0,9))
myString1.addAttribute(NSParagraphStyleAttributeName, value:myString1ParaStyle1, range:NSMakeRange(9,8))
myString1.addAttribute(NSUnderlineColorAttributeName, value:myString1Color1, range:NSMakeRange(9,8))
myString1.addAttribute(NSFontAttributeName, value:myString1Font1!, range:NSMakeRange(9,8))
myString1.addAttribute(NSForegroundColorAttributeName, value:myString1Color3, range:NSMakeRange(9,8))
myString1.addAttribute(NSUnderlineColorAttributeName, value:myString1Color1, range:NSMakeRange(17,1))
myString1.addAttribute(NSParagraphStyleAttributeName, value:myString1ParaStyle1, range:NSMakeRange(17,1))
myString1.addAttribute(NSFontAttributeName, value:myString1Font1!, range:NSMakeRange(17,1))
myString1.addAttribute(NSParagraphStyleAttributeName, value:myString1ParaStyle1, range:NSMakeRange(18,5))
myString1.addAttribute(NSUnderlineColorAttributeName, value:myString1Color1, range:NSMakeRange(18,5))
myString1.addAttribute(NSFontAttributeName, value:myString1Font1!, range:NSMakeRange(18,5))
myString1.addAttribute(NSForegroundColorAttributeName, value:myString1Color4, range:NSMakeRange(18,5))

better answer without the underline nonsense that I added to my previous answer and with natural alignment:

var myString1 = NSMutableAttributedString(string:"hello how are you buddy")

let myString1Font1 = UIFont(name:"Helvetica", size:14.0)

let myString1Color1 = UIColor(red: 0.000000, green: 0.176471, blue: 0.600000, alpha: 1.000000)
let myString1Color2 = UIColor(red: 0.247059, green: 0.411765, blue: 0.117647, alpha: 1.000000)
let myString1Color3 = UIColor(red: 0.607843, green: 0.172549, blue: 0.003922, alpha: 1.000000)

var myString1ParaStyle1 = NSMutableParagraphStyle()
myString1ParaStyle1.alignment = NSTextAlignment.Natural


myString1.addAttribute(NSForegroundColorAttributeName, value:myString1Color1, range:NSMakeRange(0,9))
myString1.addAttribute(NSParagraphStyleAttributeName, value:myString1ParaStyle1, range:NSMakeRange(0,9))
myString1.addAttribute(NSFontAttributeName, value:myString1Font1!, range:NSMakeRange(0,9))
myString1.addAttribute(NSFontAttributeName, value:myString1Font1!, range:NSMakeRange(9,1))
myString1.addAttribute(NSParagraphStyleAttributeName, value:myString1ParaStyle1, range:NSMakeRange(9,1))
myString1.addAttribute(NSForegroundColorAttributeName, value:myString1Color2, range:NSMakeRange(10,7))
myString1.addAttribute(NSParagraphStyleAttributeName, value:myString1ParaStyle1, range:NSMakeRange(10,7))
myString1.addAttribute(NSFontAttributeName, value:myString1Font1!, range:NSMakeRange(10,7))
myString1.addAttribute(NSFontAttributeName, value:myString1Font1!, range:NSMakeRange(17,1))
myString1.addAttribute(NSParagraphStyleAttributeName, value:myString1ParaStyle1, range:NSMakeRange(17,1))
myString1.addAttribute(NSForegroundColorAttributeName, value:myString1Color3, range:NSMakeRange(18,5))
myString1.addAttribute(NSParagraphStyleAttributeName, value:myString1ParaStyle1, range:NSMakeRange(18,5))
myString1.addAttribute(NSFontAttributeName, value:myString1Font1!, range:NSMakeRange(18,5))

Oh yes, and I see you want this in a UILabel, well UILabel has a property called "AttributedText", you should set this property to this string I made for you DON'T set the "text" property.

do this like so

myLabel.attributedText = myString1

Also, here's the simplified colors:

let myString1Color1 = UIColor.blueColor()
let myString1Color2 = UIColor.greenColor()
let myString1Color3 = UIColor.redColor()

and even another way to do this:

var myString1 = NSMutableAttributedString(string:"hello how are you buddy?")

let myString1Font1 = UIFont(name:"Helvetica", size:14.0)

let myString1Color1 = UIColor.blueColor()
let myString1Color2 = UIColor.greenColor()
let myString1Color3 = UIColor.redColor()

let originalNSString = myString1.string as NSString
let myString1Range1 = originalNSString.rangeOfString("hello how ")
let myString1Range2 = originalNSString.rangeOfString("are you")
let myString1Range3 = originalNSString.rangeOfString(" ")
let myString1Range4 = originalNSString.rangeOfString("buddy?")

var myString1ParaStyle1 = NSMutableParagraphStyle()
myString1ParaStyle1.alignment = NSTextAlignment.Natural
myString1ParaStyle1.baseWritingDirection = NSWritingDirection.Natural
myString1ParaStyle1.defaultTabInterval = 0
myString1ParaStyle1.firstLineHeadIndent = 0
myString1ParaStyle1.headIndent = 0
myString1ParaStyle1.hyphenationFactor = 0
myString1ParaStyle1.lineBreakMode = NSLineBreakMode.ByWordWrapping
myString1ParaStyle1.lineHeightMultiple = 0
myString1ParaStyle1.lineSpacing = 0
myString1ParaStyle1.maximumLineHeight = 0
myString1ParaStyle1.minimumLineHeight = 0
myString1ParaStyle1.paragraphSpacing = 0
myString1ParaStyle1.paragraphSpacingBefore = 0
myString1ParaStyle1.tailIndent = 0

myString1.addAttribute(NSForegroundColorAttributeName, value:myString1Color1, range:myString1Range1)
myString1.addAttribute(NSParagraphStyleAttributeName, value:myString1ParaStyle1, range:myString1Range1)
myString1.addAttribute(NSFontAttributeName, value:myString1Font1!, range:myString1Range1)
myString1.addAttribute(NSForegroundColorAttributeName, value:myString1Color2, range:myString1Range2)
myString1.addAttribute(NSParagraphStyleAttributeName, value:myString1ParaStyle1, range:myString1Range2)
myString1.addAttribute(NSFontAttributeName, value:myString1Font1!, range:myString1Range2)
myString1.addAttribute(NSFontAttributeName, value:myString1Font1!, range:myString1Range3)
myString1.addAttribute(NSParagraphStyleAttributeName, value:myString1ParaStyle1, range:myString1Range3)
myString1.addAttribute(NSForegroundColorAttributeName, value:myString1Color3, range:myString1Range4)
myString1.addAttribute(NSParagraphStyleAttributeName, value:myString1ParaStyle1, range:myString1Range4)
myString1.addAttribute(NSFontAttributeName, value:myString1Font1!, range:myString1Range4)

Upvotes: 2

Related Questions