好吧,我知道这对每个人来说都是新的,但我认为这是一个简单的概念-我在这里是为了做一个自定义贴纸消息应用程序扩展:
https://code.tutsplus.com/tutorials/create-an-imessage-app-in-ios-10--cms-26870
我准确地复制了所有内容,并试图创建一个基本的MSStickerBrowserView显示(然后使用逻辑进行过滤,但还没有尝试),我在这里的资产文件夹中使用了标签pngs:

本教程似乎不是从资产中加载的,而是从它们的项目中加载的,而不管它们的代码是否像这里一样古老:
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
我在这上面什么都找不到。如何才能在应用程序中以编程方式显示我的贴纸呢?
错误:

这些是我试图加载的图像,不管它们的名字是什么:

发布于 2016-09-26 17:50:51
教程不使用资产目录的原因是,当调用包上的fileURL方法时,无法获得放置在.xcassets文件夹中的图像的有效urlForResource。
你需要单独添加你的资产,就像你把其他文件带到应用程序中一样。此时调用包上的pathForResource或urlForResource将不再返回零。
编辑:这里有一个函数,它将取一个文件夹名,循环遍历它的内容并返回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")请注意,不要在文件夹名称的开头包含正斜杠('/')。
发布于 2017-02-17 05:02:26
只需将"resourceUrl“改为:
let url = Bundle.main.url(forResource: "Sticker \(i)", withExtension: "png")在Swift 3中,代码被替换了。
发布于 2017-08-19 05:56:50
您可以将图像放在这样的文件夹中(XCODE Viewport):

它使事情更有组织性,但不需要太多的代码,就像把它们放在.xcasset中一样。
它可以通过创建一个新组来完成,而不是通过以下方式创建一个.xcasset (右键单击消息扩展并单击new ):

StickerBrowserView的以下代码可以如下所示:
import UIKit
import Messages
class StickerBrowserViewController: MSStickerBrowserViewController {
var stickers = [MSSticker]()
func changeBrowserViewBackgroundColor(color: UIColor){
stickerBrowserView.backgroundColor = color
}
func loadStickers(){
createSticker(asset: "1", localizedDescription:"grinning face")
createSticker(asset: "2", localizedDescription:"grimacing face")
createSticker(asset: "3", localizedDescription:"grinning face with smiling eyes")
createSticker(asset: "4", localizedDescription:"face with tears of joy")
createSticker(asset: "5", localizedDescription:"smiling face with open mouth")
createSticker(asset: "6", localizedDescription:"smiling face with open mouth and smiling eyes")
}
func createSticker(asset: String, localizedDescription: String){
guard let stickerPath = Bundle.main.path(forResource:asset, ofType:"png") else {
print("couldn't create the sticker path for", asset)
return
}
// we use URL so, it's possible to use image from network
let stickerURL = URL(fileURLWithPath:stickerPath)
let sticker: MSSticker
do {
try sticker = MSSticker(contentsOfFileURL: stickerURL, localizedDescription: localizedDescription)
// localizedDescription for accessibility
stickers.append(sticker)
}catch {
print(error)
return
}
}
override func numberOfStickers(in stickerBrowserView: MSStickerBrowserView) -> Int{
return stickers.count
}
override func stickerBrowserView(_ stickerBrowserView: MSStickerBrowserView, stickerAt index: Int) -> MSSticker{
return stickers[index] as MSSticker
}
}(Ps. )不是我的博客,而是在谷歌上发现的,它非常有用)
https://stackoverflow.com/questions/39541105
复制相似问题