我正在尝试创建有大纲的文本。我目前正在使用带有nsattributedstring的sklabelnode,从ios 11开始,您现在可以在spritekit中使用它。问题是,如果笔划宽度太厚,那么轮廓就会被sklabelnode的边框所截断。请看下面的图片和代码。
swift - SKLabelNode边界和界限问题-LMLPHP

extension SKLabelNode {

    func addStroke(_ strokeColor:UIColor) {

        let font = UIFont(name: self.fontName!, size: self.fontSize)
        let attributes:[NSAttributedStringKey:Any] = [.strokeColor: strokeColor, .strokeWidth: 20.0, .font: font!]
        let attributedString = NSMutableAttributedString(string: " \(self.text!) ", attributes: attributes)
        let label1 = SKLabelNode()
        label1.horizontalAlignmentMode = self.horizontalAlignmentMode
        label1.text = self.text
        label1.zPosition = -1
        label1.attributedText = attributedString
        self.addChild(label1)
    }
}

我查看了扩展sklabelnode作为边界文本的框架,但这是一个get-only属性。我试图添加前导/尾随空格,但它们似乎是自动修剪的。对strokeWidth使用负值可以工作,但会创建一个内部笔划,我更喜欢使用外部笔划。
有什么想法吗?提前谢谢你的帮助!
迈克

最佳答案

不需要为笔划创建单独的节点。
使用负宽度值仅渲染不带填充的笔划。
使用.foregroundColor填充。
您应该首先检查属性字符串是否已经存在,以确保您不会将其删除。
代码如下:

extension SKLabelNode {

   func addStroke(color:UIColor, width: CGFloat) {

        guard let labelText = self.text else { return }

        let font = UIFont(name: self.fontName!, size: self.fontSize)

        let attributedString:NSMutableAttributedString
        if let labelAttributedText = self.attributedText {
            attributedString = NSMutableAttributedString(attributedString: labelAttributedText)
        } else {
            attributedString = NSMutableAttributedString(string: labelText)
        }

        let attributes:[NSAttributedStringKey:Any] = [.strokeColor: color, .strokeWidth: -width, .font: font!, .foregroundColor: self.fontColor!]
        attributedString.addAttributes(attributes, range: NSMakeRange(0, attributedString.length))

        self.attributedText = attributedString
   }
}

关于swift - SKLabelNode边界和界限问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48407034/

10-09 13:02