I want to change the text color of a CATextLayer.
This does not work
myTextLayer.textColor
since there is no such property. I also got no response by setting the foreground color
textLayer.foregroundColor = someColor.CGColor
when the text layer is set up as follows
let myAttribute = [ NSFontAttributeName: UIFont(name: mongolFontName, size: fontSize )! ]
let attrString = NSMutableAttributedString(string: textLayer.displayString, attributes: myAttribute )
textLayer.frame = myFrame
textLayer.string = attrString
I have seen the Objective-C question CATextLayer textcolor is always black but the answers there didn't seem to make sense in my situation.
Since I was able to solve my problem by reading the documentation, I am sharing the answer below.
The easiest workaround is create dummy labels in IB, give them the text the color you like and set to hidden. You can then reference this color in your code to set your label to the desired color. The only way I could change the text color programmatically was by using the standard colors, UIColor.
To set the text color of a CATextLayer use
myTextLayer.foregroundColor = UIColor.cyan.cgColor
as in
let myTextLayer = CATextLayer()
myTextLayer.string = "My text"
myTextLayer.backgroundColor = UIColor.blue.cgColor
myTextLayer.foregroundColor = UIColor.cyan.cgColor
myTextLayer.frame = myView.bounds
myView.layer.addSublayer(myTextLayer)
If you don't set the color, the default is white for both the background and the foreground.
According to the documentation,
The
foregroundColor
property is only used when thestring
property is not anNSAttributedString
.
That is why you were not able to change the color. You need to add the color to the attributed string in this case.
// Attributed string
let myAttributes = [
NSAttributedStringKey.font: UIFont(name: "Chalkduster", size: 30.0)! , // font
NSAttributedStringKey.foregroundColor: UIColor.cyan // text color
]
let myAttributedString = NSAttributedString(string: "My text", attributes: myAttributes )
// Text layer
let myTextLayer = CATextLayer()
myTextLayer.string = myAttributedString
myTextLayer.backgroundColor = UIColor.blue.cgColor
//myTextLayer.foregroundColor = UIColor.cyan.cgColor // no effect
myTextLayer.frame = myView.bounds
myView.layer.addSublayer(myTextLayer)
which gives
Answer updated to Swift 4
Swift 3 solution (but same problem with other languages).
The secret is in adding titleLayer.display().
let titleLayer = CATextLayer()
titleLayer.string = "My text"
titleLayer.frame = CGRect(x:0, y:O, width:UIScreen.main.bounds.width, height:UIScreen.main.bounds.width.height)
titleLayer.font = CGFont("HelveticaNeue-UltraLight" as CFString)!
titleLayer.fontSize = 100
titleLayer.alignmentMode = kCAAlignmentCenter
titleLayer.backgroundColor = UIColor.blue.cgColor
titleLayer.foregroundColor = UIColor.cyan.cgColor
titleLayer.display()
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