SKLabelNode边界和边界问题

时间:2018-01-23 16:55:05

标签: swift text sprite-kit border sklabelnode

我正在尝试创建具有轮廓的文本。我目前正在使用带有NSAttributedString的SKLabelNode,你现在可以在iOS 11的SpriteKit中使用它。问题是,如果笔划宽度太粗,那么轮廓会被看似SKLabelNode的边界矩形切断。请参阅下面的图像和代码。

Cutoff font

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的负值可以工作,但会创建一个内部笔划,我更喜欢有一个外笔画。

有什么想法吗?在此先感谢您的帮助! 麦克

1 个答案:

答案 0 :(得分:0)

  1. 您不需要为笔划创建单独的节点。
  2. 使用负宽度值仅渲染笔划而不填充。
  3. 使用.foregroundColor填充。
  4. 您应首先检查是否已存在属性字符串,以确保您不会破坏它。
  5. 以下是代码:

    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
       }
    }