Swift SKLabelNode边界和边界问题

Swift SKLabelNode边界和边界问题,swift,text,sprite-kit,border,sklabelnode,Swift,Text,Sprite Kit,Border,Sklabelnode,我正在尝试创建具有大纲的文本。我目前正在使用带有NSAttributeString的SKLabelNode,从iOS 11开始,您现在可以在SpriteKit中使用它。问题是,如果笔划宽度太粗,则轮廓会被SKLabelNode的边界矩形所切断。请参阅下面的图片和代码 我查看了如何扩展作为边框文本的SKLabelNode的框架,但这是一个get-only属性。我试图添加前导/尾随空格,但它们似乎是自动修剪的。对strokeWidth使用负值可以工作,但会创建内部笔划,我更喜欢使用外部笔划 有什么

我正在尝试创建具有大纲的文本。我目前正在使用带有NSAttributeString的SKLabelNode,从iOS 11开始,您现在可以在SpriteKit中使用它。问题是,如果笔划宽度太粗,则轮廓会被SKLabelNode的边界矩形所切断。请参阅下面的图片和代码

我查看了如何扩展作为边框文本的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
       }
    }
    

    是否需要在标签节点内创建标签节点才能实现此操作?你就是这样得到提纲的吗?看起来一个labelnode的大小限制了另一个,这就是问题所在吗?谢谢您的回复。为了获得这种效果,大纲标签必须位于文本标签的后面。我曾尝试将其添加为单独的节点(不是文本标签的子节点),但最终得到了相同的结果。好的,我打算建议使用SKNode作为2的“容器”,但如果您尝试过,我不确定。祝你好运它不是一个完整的框架。甚至不接近。因此,添加了NSAttributedString之类的内容,但尚未完成。没有测试,也没有透明性让你在浪费时间假设某件事情可行之前知道这一点。苹果的傲慢。如果您需要具有视觉效果的动态类型,那么您就太倒霉了。如果您需要具有动态效果的动态类型,Sprite工具包可能会在2028年提供。
    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
       }
    }