Ios MessageAppExtension:如何将标签图像从资产加载到MSSTICKRBrowserview?
好的,我知道这对每个人来说都是新的,但我认为这是一个简单的概念-我遵循这一点来制作一个定制贴纸消息应用程序扩展: 我准确地复制了所有内容,并尝试创建一个基本的MSSTICKRBROWSVIEW显示(随后使用逻辑过滤,但尚未尝试)标签PNG,我的资产文件夹中有: 本教程似乎不是从资源加载的,而是从它们的项目加载的,不管它们的代码是否旧,如下所示:Ios MessageAppExtension:如何将标签图像从资产加载到MSSTICKRBrowserview?,ios,swift,message,swift3,ios10,Ios,Swift,Message,Swift3,Ios10,好的,我知道这对每个人来说都是新的,但我认为这是一个简单的概念-我遵循这一点来制作一个定制贴纸消息应用程序扩展: 我准确地复制了所有内容,并尝试创建一个基本的MSSTICKRBROWSVIEW显示(随后使用逻辑过滤,但尚未尝试)标签PNG,我的资产文件夹中有: 本教程似乎不是从资源加载的,而是从它们的项目加载的,不管它们的代码是否旧,如下所示: var stickers = [MSSticker]() func loadStickers() { for i in 1
var stickers = [MSSticker]()
func loadStickers() {
for i in 1...2 {
if let url = Bundle.main.urlForResource("Sticker \(i)", withExtension: "png") { //ERROR!!
do {
let sticker = try MSSticker(contentsOfFileURL: url, localizedDescription: "")
stickers.append(sticker)
} catch {
print(error)
}
}
}
}
我得到了错误
捆绑包没有成员URLforResource
我在这上面找不到任何东西。如何在应用程序中以编程方式显示标签
错误:
以下是我尝试加载的图像,无论它们的名称如何:
教程不使用资产目录的原因是,在对捆绑包调用urlForResource方法时,无法为放置在.xAssets文件夹中的图像获取有效的fileURL 你需要单独添加你的资产,就像将其他文件带入应用程序一样。在该点调用捆绑包上的pathForResource或urlForResource将不再返回nil 编辑:这里有一个函数,它将获取文件夹名称,循环遍历其内容并返回[MSSticker]?根据它的发现
func createStickers(from folderName: String) -> [MSSticker]? {
guard
let path = Bundle.main.resourcePath
else { return nil }
var stickers = [MSSticker]()
let folderPath = "\(path)/\(folderName)"
let folderURL = URL(fileURLWithPath: folderPath)
//get a list of urls in the chosen directory
do {
let imageURLs = try FileManager.default.contentsOfDirectory(at: folderURL,
includingPropertiesForKeys: nil,
options: .skipsHiddenFiles)
//loop through the found urls
for url in imageURLs {
//create the sticker and add it, or handle error
do {
let sticker = try MSSticker(contentsOfFileURL: url, localizedDescription: "yourDescription")
stickers.append(sticker)
} catch let error {
print(error.localizedDescription)
}
}
} catch let error {
print(error.localizedDescription)
}
//return nil if stickers array is empty
return stickers.isEmpty ? nil : stickers
}
这应该让你只需要打电话,就可以得到你想要的:
let stickers = createStickers(from: "YourFolderName")
请注意不要在文件夹名称的开头包含正斜杠(“/”)。只需将“resourceUrl”替换为:
代码在Swift 3中被替换。您可以将图像放入这样的文件夹(XCODE视口): 它使事情更有条理,但不需要像放在.xAsset中那样多的代码 可以通过创建新组而不是创建.xAsset来完成(右键单击消息扩展并单击新建组): 贴纸BrowserView的以下代码可以这样调用:
导入UIKit
导入消息
类别浏览器服务控制器:MSSTICKRBROWSERVIEWCONTROLLER{
var标签=[MSSticker]()
func changeBrowserViewBackgroundColor(颜色:UIColor){
贴纸browserview.backgroundColor=颜色
}
func装载标签(){
createSticker(资产:“1”,本地化描述:“笑脸”)
创建标签(资产:“2”,本地化描述:“鬼脸”)
createSticker(资产:“3”,本地化描述:“笑眯眯的脸”)
createSticker(资产:“4”,本地化描述:“脸上充满喜悦的泪水”)
createSticker(资产:“5”,本地化描述:“张开嘴的笑脸”)
createSticker(资产:“6”,本地化描述:“张开嘴微笑的脸和微笑的眼睛”)
}
func CreateStacker(资产:字符串,本地化描述:字符串){
guard-let-patch=Bundle.main.path(forResource:asset,of type:“png”)else{
打印(“无法为”资产“创建标签路径)
返回
}
//我们使用URL,所以可以使用来自网络的图像
让TackerURL=URL(fileURLWithPath:TackerPath)
让贴纸:MSSticker
做{
try sticker=MSSticker(内容文件URL:stickerURL,localizedDescription:localizedDescription)
//本地化可访问性说明
贴纸。附加(贴纸)
}抓住{
打印(错误)
返回
}
}
覆盖func NumberOfStickets(在SticketBrowserView:MSStickerBrowserView中)->Int{
退回贴纸。计数
}
覆盖功能标签浏览视图(uStickerBrowserView:MSStickerBrowserView,标签索引:Int)->MSSticker{
返回标签[索引]作为MSSticker
}
}
(顺便说一句,不是我的博客,但在谷歌上找到了它,它非常有用)好的,但看看我的错误问题-我如何用它加载我的资产文件夹的内容?对不起,在Swift 3中它应该是Bundle.main.url(forResource:String?,withExtension:String?)对不起,我提供了错误的声明。现在检查它。好的,这是有效的,但是我如何将所有PNG加载到我的标签包文件夹中的资产中?我在上面包括了一张图片是的,我知道了,但是我想把一个文件夹放满特定的图片,并对它们进行迭代(不仅仅是单个图片)。到目前为止,我无法导入文件夹,因为文件夹没有任何扩展名,所以您无法使用urlForResource-我如何才能做到这一点?@skyguy-我添加了一个函数,可以完成您需要的功能。我在一个示例项目中对它进行了测试,能够遍历文件夹并创建仅添加到扩展中的图像的标签。我将其放在扩展文件夹中,一切都正常运行它是一个.xcassets文件夹吗?只是再次运行了我的…工作正常,但当尝试访问一个不存在的文件夹或是一个资产文件夹时,我会收到相同的错误消息。我建议您查看模拟器目录并按照路径验证它是否确实存在
let url = Bundle.main.url(forResource: "Sticker \(i)", withExtension: "png")