swift - 屏幕保护程序中的 SpriteKit 找不到图像
问题描述
我正在使用 SpriteKit 在 Swift 中制作屏幕保护程序。在应用程序中测试屏幕保护程序时,所有纹理都正确加载。一旦我制作 .saver 并将其加载到系统偏好设置中,SpriteKit 就会显示找不到图像。
我用过(imageNamed: "")
,所以我试着用
var imageURL = Bundle.main.url(forResource: "gradient", withExtension: "png")
let imageGradient = NSImage(contentsOf: imageURL!)!
,但我得到了相同的结果。SpriteKit 在 .saver 文件中内置时无法访问图像,但在通过应用程序运行时可以完美运行。
我已将图像包含在捆绑包、资产中、Target 的 Copy Bundle Resources/Development Assets/Resource Tags 中。
您可以从这里克隆项目:https ://github.com/Nazar-Bibik/SavePortal
解决方案
我研究了这个项目:https ://github.com/leebradley/nyan-screensaver 我发现了如何正确地做到这一点:
- 您需要将图像放入包中,而不是 xcassets(将其与 .swift 文件一起放入)
- 而不是使用图像名称使用以下
let sourceBundle = Bundle(for: MainSwiftFile.self)
let imagePath = sourceBundle.path(forResource: "picture-name", ofType: "png")!
neededTextures = SKTexture(imageNamed: imagePath)
您需要在主体类(info.plist 文件中的主体类)中提供 .swift 文件的名称。其余的很简单 - forResource 是一个文件名,ofType 是一个文件扩展名,而不是在 imageNamed 中传递通常的名称:您提供文件路径字符串。“imagePath”是一个字符串类型。
推荐阅读
- elasticsearch - 如何从 AppSync 解析器执行批量 ElasticSearch 操作?
- c - VS2019 - stdbool.h 包含在被 stdio.h 包围时被禁用包含
- arrays - 就执行时间而言,哪个函数更快?贝塔()还是阿尔法()?
- c++ - 示例代码:如何将宽度固定为不等于 0?
- go - 无限for循环内的goroutine。这是一个好习惯吗?
- asynchronous - Tornado 异步端点不起作用
- wcf - 如何执行 ssl 用户身份验证
- android - 如何实现谷歌登录
- android - Android - 为什么我需要完整的活动名称才能访问我的可绘制对象和 XML 文件?
- c# - 在 Asp.Net Core 5 Identity 中未调用自定义 UserConfirmation