留在SpriteKit中,是否有可能通過TextKit提供的更大的控制來創建更多的「藝術」文本,然後(以某種方式)將這些字符串轉換爲圖像,以便它們可以用作SKSpriteNodes?SKLabel避免使用TextKit,然後創建SKTexture?
我問,因爲我想做一些更嚴重的字距調整的東西......更大的間距,以及一些其他東西不可能與SKLabels,但是TextKit的一部分,但我希望他們當我完成讓他們看起來像我想要的方式後立即成爲位圖。
但我找不到將TextKit變成圖像的方法。
留在SpriteKit中,是否有可能通過TextKit提供的更大的控制來創建更多的「藝術」文本,然後(以某種方式)將這些字符串轉換爲圖像,以便它們可以用作SKSpriteNodes?SKLabel避免使用TextKit,然後創建SKTexture?
我問,因爲我想做一些更嚴重的字距調整的東西......更大的間距,以及一些其他東西不可能與SKLabels,但是TextKit的一部分,但我希望他們當我完成讓他們看起來像我想要的方式後立即成爲位圖。
但我找不到將TextKit變成圖像的方法。
您可以在CGContext
中繪製文本,然後從中創建紋理並將該紋理指定給SKSpriteNode
。
這裏是this GitHub project一個例子:
class ASAttributedLabelNode: SKSpriteNode {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
init(size: CGSize) {
super.init(texture: nil, color: UIColor.clear, size: size)
}
var attributedString: NSAttributedString! {
didSet {
draw()
}
}
func draw() {
guard let attrStr = attributedString else {
texture = nil
return
}
let scaleFactor = UIScreen.main.scale
let colorSpace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo = CGImageAlphaInfo.premultipliedLast.rawValue
guard let context = CGContext(data: nil, width: Int(size.width * scaleFactor), height: Int(size.height * scaleFactor), bitsPerComponent: 8, bytesPerRow: Int(size.width * scaleFactor) * 4, space: colorSpace, bitmapInfo: bitmapInfo) else {
return
}
context.scaleBy(x: scaleFactor, y: scaleFactor)
context.concatenate(CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: size.height))
UIGraphicsPushContext(context)
let strHeight = attrStr.boundingRect(with: size, options: .usesLineFragmentOrigin, context: nil).height
let yOffset = (size.height - strHeight)/2.0
attrStr.draw(with: CGRect(x: 0, y: yOffset, width: size.width, height: strHeight), options: .usesLineFragmentOrigin, context: nil)
if let imageRef = context.makeImage() {
texture = SKTexture(cgImage: imageRef)
} else {
texture = nil
}
UIGraphicsPopContext()
}
}
非常感謝你的這個,使用'guard let ...'的最好例子,我剛剛意識到的東西可能是一個非常酷的工具。比'如果讓...'好看多了! – Confused
這是動態的文字或靜態 –
@MobileBen我** **假設靜態的,那麼一旦這樣做了,並想通了,也許找到一種方法,使其適用於動態文本 – Nik
是的,靜態文本內容,但我將移動並縮放由此產生的最終位圖。 – Confused