我正在尝试在游戏中显示右对齐的时间码。我原本期望数字都具有相同的宽度,但在 SpriteKit 中似乎并非如此,尽管在 AppKit 中似乎是这样。
在 SpriteKit 中,使用默认字体时,数字 1 和其余数字之间的宽度存在明显差异(1 更细),因此每当显示最低有效数字 1 的数字时,所有前面的数字都会稍微向右移动。即使使用具有
NSAttributedString
属性的字体设置 fixedAdvance
,也会发生这种情况。
class GameScene: SKScene {
override func didMove(to view: SKView) {
let label = SKLabelNode(text: "")
view.scene!.addChild(label)
// label.horizontalAlignmentMode = .left
label.horizontalAlignmentMode = .right
var i = 11
Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { _ in
label.text = "\(i)"
// let font = NSFont(descriptor: NSFontDescriptor(fontAttributes: [.name: "HelveticaNeue-UltraLight", .fixedAdvance: 20]), size: 30)!
// let paragraphStyle = NSMutableParagraphStyle()
// paragraphStyle.alignment = .right
// label.attributedText = NSAttributedString(string: "\(i)", attributes: [.font: font, .foregroundColor: SKColor.labelColor, .paragraphStyle: paragraphStyle])
i += 5
}
}
}
使用AppKit,当使用SpriteKit的默认字体
HelveticaNeue-UltraLight
时,无论我是否设置fixedAdvance
字体属性,都不存在这个问题。
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let font = NSFont(descriptor: NSFontDescriptor(fontAttributes: [.name: "HelveticaNeue-UltraLight"]), size: 30)!
// let font = NSFont(descriptor: NSFontDescriptor(fontAttributes: [.name: "HelveticaNeue-Light", .fixedAdvance: 20]), size: 30)!
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .right
let textField = NSTextField(labelWithString: "")
textField.font = font
textField.alignment = .right
// textField.alignment = .left
textField.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
view.addSubview(textField)
var i = 11
Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { _ in
textField.stringValue = "\(i)"
// textField.attributedStringValue = NSAttributedString(string: "\(i)", attributes: [.font: font, .paragraphStyle: paragraphStyle])
i += 5
}
}
}
这个问题有解决办法吗?
我找到了一种解决方法,可以使最低有效数字的宽度与其他数字相等:
label.numberOfLines = 0