SKLabelNode在显示相同位数的不同数字时不断来回跳跃

问题描述 投票:0回答:1

我正在尝试在游戏中显示右对齐的时间码。我原本期望数字都具有相同的宽度,但在 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
        }
    }

}

这个问题有解决办法吗?

sprite-kit appkit sklabelnode
1个回答
0
投票

我找到了一种解决方法,可以使最低有效数字的宽度与其他数字相等:

label.numberOfLines = 0
© www.soinside.com 2019 - 2024. All rights reserved.