Swift 如何更改 CATextLayer 中的文本颜色
How to change the text color in a CATextLayer in Swift
我想更改 CATextLayer 的文本颜色。
这行不通
myTextLayer.textColor
因为没有这样的属性。我设置前景色也没有反应
textLayer.foregroundColor = someColor.CGColor
文字层设置时如下
let myAttribute = [ NSFontAttributeName: UIFont(name: mongolFontName, size: fontSize )! ]
let attrString = NSMutableAttributedString(string: textLayer.displayString, attributes: myAttribute )
textLayer.frame = myFrame
textLayer.string = attrString
我看过 Objective-C 问题 CATextLayer textcolor is always black,但那里的答案似乎对我的情况没有意义。
由于我能够通过阅读 documentation 解决我的问题,所以我在下面分享答案。
一般情况
要设置 CATextLayer 的文本颜色,请使用
myTextLayer.foregroundColor = UIColor.cyan.cgColor
如
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)
如果不设置颜色,背景和前景默认都是白色。
使用属性字符串
根据 documentation,
The foregroundColor
property is only used when the string
property is not an NSAttributedString
.
这就是您无法更改颜色的原因。在这种情况下,您需要将颜色添加到属性字符串。
// 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)
这给出了
答案已更新为 Swift 4
Swift 3 解决方案(但其他语言也有同样的问题)。
秘诀在于添加 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()
我想更改 CATextLayer 的文本颜色。
这行不通
myTextLayer.textColor
因为没有这样的属性。我设置前景色也没有反应
textLayer.foregroundColor = someColor.CGColor
文字层设置时如下
let myAttribute = [ NSFontAttributeName: UIFont(name: mongolFontName, size: fontSize )! ]
let attrString = NSMutableAttributedString(string: textLayer.displayString, attributes: myAttribute )
textLayer.frame = myFrame
textLayer.string = attrString
我看过 Objective-C 问题 CATextLayer textcolor is always black,但那里的答案似乎对我的情况没有意义。
由于我能够通过阅读 documentation 解决我的问题,所以我在下面分享答案。
一般情况
要设置 CATextLayer 的文本颜色,请使用
myTextLayer.foregroundColor = UIColor.cyan.cgColor
如
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)
如果不设置颜色,背景和前景默认都是白色。
使用属性字符串
根据 documentation,
The
foregroundColor
property is only used when thestring
property is not anNSAttributedString
.
这就是您无法更改颜色的原因。在这种情况下,您需要将颜色添加到属性字符串。
// 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)
这给出了
答案已更新为 Swift 4
Swift 3 解决方案(但其他语言也有同样的问题)。
秘诀在于添加 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()