如何从SKLabelNode获得CGPath?

时间:2016-06-21 14:46:11

标签: ios swift sprite-kit cgpath sklabelnode

如何从SKLabelNode中提取多边形路径?例如,我希望像这样的数字的边路径沿着SKSpriteNode

移动

enter image description here

你认为可能吗?或者我必须为每个字符创建一个多边形,如:

var pathNumberOne = CGPathCreateMutable()
CGPathMoveToPoint(pathNumberOne , nil, 0, 0)
CGPathAddLineToPoint(pathNumberOne , nil, 20, 0) 
CGPathAddLineToPoint.....
........
........

1 个答案:

答案 0 :(得分:0)

我认为最好的办法就是获得边界。 基本想法是使用SKShapeNode绘制边框并将其添加为SKLabelNode的子项。像这样:

if let path = createBorderPathForText() {
    let border = SKShapeNode()

    border.strokeColor = borderColor
    border.lineWidth = 7;
    border.path = path
    border.position = positionBorder(border)
    labelNode.addChild(border)
}

困难的部分是如何为文本创建边框。这是Core Text开始的地方。使用函数CTFontGetGlyphsForCharacters,您可以检索文本字符串中所有字符的字形。对于每个字形,您可以使用CGPath创建CTFontCreatePathForGlyph。您唯一要做的就是将所有字符的CGPath加在一起,并在SKShapeNode中使用它。您可以使用函数CGPathAddPath执行此操作。要获得字形/字符的相对位置,可以使用函数CTFontGetAdvancesForGlyphs。把它们放在一起:

private func createBorderPathForText() -> CGPathRef? {
    let chars = getTextAsCharArray()
    let borderFont = CTFontCreateWithName(self.fontName, self.fontSize, nil)

    var glyphs = Array(count: chars.count, repeatedValue: 0)
    let gotGlyphs = CTFontGetGlyphsForCharacters(borderFont, chars, &glyphs, chars.count)

    if gotGlyphs {
        var advances = Array(count: chars.count, repeatedValue: CGSize())
        CTFontGetAdvancesForGlyphs(borderFont, CTFontOrientation.OrientationHorizontal, glyphs, &advances, chars.count);

        let letters = CGPathCreateMutable()
        var xPosition = 0 as CGFloat
        for index in 0...(chars.count - 1) {
            let letter = CTFontCreatePathForGlyph(borderFont, glyphs[index], nil)
            var t = CGAffineTransformMakeTranslation(xPosition , 0)
            CGPathAddPath(letters, &t, letter)
            xPosition = xPosition + advances[index].width
        }

        return letters
    } else {
        return nil
    }
}

你可以在github上找到一个名为 MKOutlinedLabelNode 的好项目here  有关更多详细信息,请访问此page有关spritekit中的大纲文本。