swift2 swift 2 sprite-kit中的多行标签?

csga3l58  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(172)

我需要能够在swift 2 sprite-kit中为一个游戏制作一个多行标签。文本需要环绕而不是离开屏幕。贝娄是我所拥有的,但我不知道该怎么做

import Foundation
import UIKit
import SpriteKit

class JDQuotes: SKLabelNode {

    var number = 0

    init(num: Int) {
        super.init()

        if num == 1 { 

            text = "\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. laborum.\""

        }
    }

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

lb3vh1jj1#

从iOS 11开始,这终于在SKLabelNode中成为可能:

let lb = SKLabelNode(fontNamed: "Copperplate")
    lb.text = "Put your long text here..."
    lb.numberOfLines = 0
    lb.preferredMaxLayoutWidth = 1000
yx2lnoni

yx2lnoni2#

这里有一个Github解决方案,因为SKLabelNodes不支持多行。
引用的代码:

import SpriteKit

class SKMultilineLabel: SKNode {
//props
var labelWidth:Int {didSet {update()}}
var labelHeight:Int = 0
var text:String {didSet {update()}}
var fontName:String {didSet {update()}}
var fontSize:CGFloat {didSet {update()}}
var pos:CGPoint {didSet {update()}}
var fontColor:UIColor {didSet {update()}}
var leading:Int {didSet {update()}}
var alignment:SKLabelHorizontalAlignmentMode {didSet {update()}}
var dontUpdate = false
var shouldShowBorder:Bool = false {didSet {update()}}
//display objects
var rect:SKShapeNode?
var labels:[SKLabelNode] = []

init(text:String, labelWidth:Int, pos:CGPoint, fontName:String="ChalkboardSE-Regular",fontSize:CGFloat=10,fontColor:UIColor=UIColor.blackColor(),leading:Int=10, alignment:SKLabelHorizontalAlignmentMode = .Center, shouldShowBorder:Bool = false)
{
    self.text = text
    self.labelWidth = labelWidth
    self.pos = pos
    self.fontName = fontName
    self.fontSize = fontSize
    self.fontColor = fontColor
    self.leading = leading
    self.shouldShowBorder = shouldShowBorder
    self.alignment = alignment

    super.init()

    self.update()
}

//if you want to change properties without updating the text field,
//  set dontUpdate to false and call the update method manually.
func update() {
    if (dontUpdate) {return}
    if (labels.count>0) {
        for label in labels {
            label.removeFromParent()
        }
        labels = []
    }
    let separators = NSCharacterSet.whitespaceAndNewlineCharacterSet()
    let words = text.componentsSeparatedByCharactersInSet(separators)

    let len = countElements(text)

    var finalLine = false
    var wordCount = -1
    var lineCount = 0
    while (!finalLine) {
        lineCount++
        var lineLength = CGFloat(0)
        var lineString = ""
        var lineStringBeforeAddingWord = ""

        // creation of the SKLabelNode itself
        var label = SKLabelNode(fontNamed: fontName)
        // name each label node so you can animate it if u wish
        label.name = "line\(lineCount)"
        label.horizontalAlignmentMode = alignment
        label.fontSize = fontSize
        label.fontColor = UIColor.whiteColor()

        while lineLength < CGFloat(labelWidth)
        {
            wordCount++
            if wordCount > words.count-1
            {
                //label.text = "\(lineString) \(words[wordCount])"
                finalLine = true
                break
            }
            else
            {
                lineStringBeforeAddingWord = lineString
                lineString = "\(lineString) \(words[wordCount])"
                label.text = lineString
                lineLength = label.width
            }
        }
        if lineLength > 0 {
            wordCount--
            if (!finalLine) {
                lineString = lineStringBeforeAddingWord
            }
            label.text = lineString
            var linePos = pos
            if (alignment == .Left) {
                linePos.x -= CGFloat(labelWidth / 2)
            } else if (alignment == .Right) {
                linePos.x += CGFloat(labelWidth / 2)
            }
            linePos.y += CGFloat(-leading * lineCount)
            label.position = CGPointMake( linePos.x , linePos.y )
            self.addChild(label)
            labels.append(label)
            //println("was \(lineLength), now \(label.width)")
        }

    }
    labelHeight = lineCount * leading
    showBorder()
}
func showBorder() {
    if (!shouldShowBorder) {return}
    if let rect = self.rect {
        self.removeChildrenInArray([rect])
    }
    self.rect = SKShapeNode(rectOfSize: CGSize(width: labelWidth, height: labelHeight))
    if let rect = self.rect {
        rect.strokeColor = UIColor.whiteColor()
        rect.lineWidth = 1
        rect.position = CGPoint(x: pos.x, y: pos.y - (CGFloat(labelHeight) / 2.0))
        self.addChild(rect)
    }

}
}

编辑:您也可以检查this version,因为它已针对Swift2进行了更新

相关问题