SKLabelNode - как выровнять по центру, когда более одной строки? - PullRequest
0 голосов
/ 29 апреля 2018

При SKLabelNode может показаться, что при разрыве более чем на одну строку

результат всегда

abcde
fg

вместо

abcde
 fg

Действительно кажется, что SKLabelNode просто выровнен по левому краю, и все.

Есть ли решение - как сделать многострочное выравнивание по центру SKLabelNode?


Примечание - HorizontalAlignmentMode совершенно не связан. он просто позволяет вам выбрать, будет ли якорь всей области метки слева, справа или в центре позиции.

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

В продолжение - я разместил ссылку вместо кода, что вроде нет-нет. У меня нет большого представителя (нуб), поэтому я также не могу редактировать:)

Я недавно обнаружил, что вы можете наложить UIKit поверх сценки (возможно, Sprite Kit тоже). Я попробовал это, и это работает без потерь в FPS, поэтому я удаляю все свои оверлейные программы Spritekit (меню / метки) и использую основы UIKit (UIButton, UILabel). Если это представляет интерес, я могу поделиться некоторым кодом. Я все еще выясняю, но достаточно глубоко в этом, что я думаю, что это сработает.

0 голосов
/ 11 июня 2018

Я решил эту проблему, установив значение атрибута Text для SKLabelNode. Выглядит как самый простой способ сделать это, надеюсь, Apple исправит эту проблему в ближайшее время.

Swift 4

let attrString = NSMutableAttributedString(string: yourString)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center
let range = NSRange(location: 0, length: yourString.count)
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: paragraphStyle, range: finalRange)
attrString.addAttributes([NSAttributedStringKey.foregroundColor : UIColor.black, NSAttributedStringKey.font : UIFont.systemFont(ofSize: 30)], range: range)
yourLabelNode.attributedText = attrString
0 голосов
/ 04 мая 2018

Кажется, что Apple SKLabel просто не центрирует многострочный текст. (По состоянию на 2018 г.)

Поведение можно описать только как прерывистое - вторая и последняя строки просто сбрасываются влево независимо от того, какой параметр.

Одним из решений является использование «второй метки», пример ниже.

Позже ...

@ MartinŠkorc, похоже, обнаружил, что вы можете использовать AttributedString с SKLabels - так, отлично! Спасибо Мартин!

import SpriteKit

class StupidMultilineSKLabelNode: SKLabelNode {

    // Apple's SKLabel does not center multi-line text

    // this class works around the problem by making
    // a "sub" SKLabel for the second line

    // if the .text includes a newline, a line break,
    // this class will present it as a two-line SKLabel,
    // but properly centered (each line itself centered).
    // (this example allows just the one extra line)

    // please note,
    // this is not meant to be a generalized class;
    // rather it is meant to work quick in a specific case.
    // you can change it as needed

    // using a "second label" does seem to be the only solution
    // until Apple address the issue

    var stupidExtraLabel: SKLabelNode

    override init() {

        stupidExtraLabel = SKLabelNode()
        super.init()

        stupidExtraLabel.basicSettings()
        // the simplest approach: in "basicSettings" simply set
        // your point size, font, color, etc etc as you wish
        // just always use that call to set all labels in the project

        stupidExtraLabel.position = CGPoint(x: 0, y: -10)
        stupidExtraLabel.text = ""

        self.addChild(stupidExtraLabel)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override var alpha: CGFloat {

        didSet {

            super.alpha = alpha
            stupidExtraLabel.alpha = alpha
        }
    }

    override var fontColor: UIColor? {

        didSet {

            super.fontColor = fontColor
            stupidExtraLabel.fontColor = fontColor
        }
    }

    override var text: String? {

        didSet {

            let lines: [String] = text!.components(separatedBy: ["\n"])
            super.text = ""
            stupidExtraLabel.text = ""
            if lines.count > 0 { super.text = lines[0] }
            if lines.count > 1 { stupidExtraLabel.text = lines[1] }

            stupidExtraLabel.position = CGPoint(x: 0, y: -10)
        }
    }
}
...