4

我正在尝试SKSpriteNode使用 SF Symbols 字体创建一个图像,虽然我可以做到,但我似乎无法将其设为黑色以外的任何颜色。

这是我的代码:

let image = UIImage.init(systemName: "gear")
let colored = image!.withTintColor(.red)
let texture = SKTexture.init(image: colored)
let sprite = SKSpriteNode.init(texture: texture, size: CGSize.init(width: 32, height: 32))

不幸的是,生成的精灵总是以黑色(而不是红色)出现。

我究竟做错了什么?

4

2 回答 2

6

我认为问题在于 UIImage 是矢量图形,只有 UIImageViews 才能正确处理它们。也许我们可以将它强制为位图图像以使其正常工作。

以下是一些您可以尝试的实验代码:

let image = UIImage(systemName: "gear").withTintColor(.red)

let data = image.pngData()
let newImage = UIImage(data:data) 
let texture = SKTexture(image: newImage)
let sprite = SKSpriteNode(texture: texture,size: CGSize(width: 32, height: 32))
于 2020-01-24T01:43:19.177 回答
2

你必须设置colorBlendFactor精灵。

func makeSprite(symbolName: String) -> SKSpriteNode {
    let image = Image(systemName: symbolName)

    // Thanks Oskar!
    // https://stackoverflow.com/a/69315037/1610473
    // See my adapted version of his code further down; I
    // think you won't need it if you're on iOS, meaning
    // using UIImage, but that's all black magic to me.
    let renderedByOskar = image.renderAsImage()!

    let texture = SKTexture(image: renderedByOskar)
    let sprite = SKSpriteNode(texture: texture)

    sprite.color = .green
    sprite.colorBlendFactor = 1 // <-- This

    return sprite
}

一个绿色符号,多亏了黑魔法:

由黑魔法制成的绿色符号

非常感谢Oskar渲染扩展,使我能够在 macOS 上执行此操作,这意味着,无需UIImage

class NoInsetHostingView<V>: NSHostingView<V> where V: View {
    override var safeAreaInsets: NSEdgeInsets {
        return .init()
    }
}

extension Image {
    func renderAsImage() -> NSImage? {
        let view = NoInsetHostingView(rootView: self)
        view.setFrameSize(view.fittingSize)
        return view.bitmapImage()
    }
}

public extension NSView {
    func bitmapImage() -> NSImage? {
        guard let rep = bitmapImageRepForCachingDisplay(in: bounds) else {
            return nil
        }

        cacheDisplay(in: bounds, to: rep)

        guard let cgImage = rep.cgImage else {
            return nil
        }

        return NSImage(cgImage: cgImage, size: bounds.size)
    }
}
于 2021-11-15T15:56:39.480 回答