【问题标题】:SKLabelNode Border and Bounds IssueSKLabelNode 边界和边界问题
【发布时间】:2018-01-23 16:55:05
【问题描述】:

我正在尝试创建具有轮廓的文本。我目前正在使用带有 NSAttributedString 的 SKLabelNode,您现在可以在 iOS 11 的 SpriteKit 中执行此操作。问题是,如果笔划宽度太厚,那么轮廓会被 SKLabelNode 的边界矩形截断。图片和代码请看下面。

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 的框架作为边框文本,但这是一个仅限获取的属性。我尝试添加前导/尾随空格,但它们似乎被自动修剪。对 strokeWidth 使用负值可以,但会创建内部笔划,我更愿意使用外部笔划。

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

【问题讨论】:

  • 是否需要在标签节点内创建标签节点才能实现这一点?你是这样得到大纲的吗?看起来一个标签节点的大小限制了另一个标签节点的大小,这是问题吗?
  • 感谢您的回复。大纲标签必须在文本标签后面才能获得这种效果。我曾尝试将其添加为单独的节点(不是文本标签的子节点),但结果相同。
  • 好的,我打算建议使用 SKNode 作为 2 的“容器”,但如果您尝试过,那么我不确定。祝你好运!
  • 这不是一个完整的框架。差远了。所以你得到了像 NSAttributedString 这样的东西,但还没有完成。在您浪费时间假设某些东西有效之前,没有任何测试或透明度可以让您知道这一点。苹果的傲慢。如果您需要具有视觉效果的动态类型,那您就很不走运了。如果您需要具有动态效果的动态类型,Sprite Kit 可能会在 2028 年推出。

标签: swift text sprite-kit border sklabelnode


【解决方案1】:
  1. 您不需要为笔画创建单独的节点。
  2. 使用负宽度值仅渲染没有填充的笔触。
  3. 使用.foregroundColor 填写。
  4. 您应该首先检查属性字符串是否已经存在,以确保您不会破坏它。

代码如下:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    相关资源
    最近更新 更多