SKLabelNode - 获取实际行数

时间:2018-01-31 18:35:41

标签: swift sprite-kit sklabelnode

在SpriteKit中,您现在可以设置SKLabelNode的行数,因此标签可能会经过几行。

let lb = SKLabelNode(fontNamed: "Courier-bold")
lb.numberOfLines = 0
lb.preferredMaxLayoutWidth = size.width

有没有办法确定SKLabelNode呈现的 ACTUAL 行数?

1 个答案:

答案 0 :(得分:1)

如果您的SKLabelNode中有常规文字,则应通过生成具有相同文字格式参数的UILabel来计算,并计算其实际行数described here

如果您已归因于文字,请使用boundingRect(with:options:context:)来获取高度。

使用常规文字:

let label = UILabel()
label.text = lb.text
label.numberOfLines = numberOfLines
label.font = UIFont(name: lb.fontName, size: lb.fontSize)

let labelHeight = label.sizeThatFits(CGSize(width: lb.preferredMaxLayoutWidth, height: .greatestFiniteMagnitude)).height

numberOfLines = Int(labelHeight / label.font.pointSize)

使用归因文字(如果它只使用一种字体):

let labelMaxSize = CGSize(width: lb.preferredMaxLayoutWidth, height: .greatestFiniteMagnitude)
let labelHeight = lb.attributedText.boundingRect(with: labelMaxSize, options: .usesLineFragmentOrigin, context: nil).size

guard let pointSize = (lb.attributedText.attributes(at: 0, effectiveRange: nil)[.font] as? UIFont)?.pointSize else {
    return
}

numberOfLines = Int(labelHeight / pointSize)