首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MessageAppExtension:如何将粘贴图像从资产加载到MSStickerBrowserView?

MessageAppExtension:如何将粘贴图像从资产加载到MSStickerBrowserView?
EN

Stack Overflow用户
提问于 2016-09-16 22:52:31
回答 3查看 2.3K关注 0票数 4

好吧,我知道这对每个人来说都是新的,但我认为这是一个简单的概念-我在这里是为了做一个自定义贴纸消息应用程序扩展:

https://code.tutsplus.com/tutorials/create-an-imessage-app-in-ios-10--cms-26870

我准确地复制了所有内容,并试图创建一个基本的MSStickerBrowserView显示(然后使用逻辑进行过滤,但还没有尝试),我在这里的资产文件夹中使用了标签pngs:

本教程似乎不是从资产中加载的,而是从它们的项目中加载的,而不管它们的代码是否像这里一样古老:

代码语言:javascript
复制
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

我在这上面什么都找不到。如何才能在应用程序中以编程方式显示我的贴纸呢?

错误:

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

EN

回答 3

Stack Overflow用户

发布于 2016-09-26 17:50:51

教程不使用资产目录的原因是,当调用包上的fileURL方法时,无法获得放置在.xcassets文件夹中的图像的有效urlForResource。

你需要单独添加你的资产,就像你把其他文件带到应用程序中一样。此时调用包上的pathForResource或urlForResource将不再返回零。

编辑:这里有一个函数,它将取一个文件夹名,循环遍历它的内容并返回MSSticker?基于它所发现的

代码语言:javascript
复制
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
}

这应该让你打电话给它,得到你想要的东西:

代码语言:javascript
复制
let stickers = createStickers(from: "YourFolderName")

请注意,不要在文件夹名称的开头包含正斜杠('/')。

票数 5
EN

Stack Overflow用户

发布于 2017-02-17 05:02:26

只需将"resourceUrl“改为:

代码语言:javascript
复制
let url = Bundle.main.url(forResource: "Sticker \(i)", withExtension: "png")

在Swift 3中,代码被替换了。

票数 1
EN

Stack Overflow用户

发布于 2017-08-19 05:56:50

您可以将图像放在这样的文件夹中(XCODE Viewport):

它使事情更有组织性,但不需要太多的代码,就像把它们放在.xcasset中一样。

它可以通过创建一个新组来完成,而不是通过以下方式创建一个.xcasset (右键单击消息扩展并单击new ):

StickerBrowserView的以下代码可以如下所示:

代码语言:javascript
复制
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. )不是我的博客,而是在谷歌上发现的,它非常有用)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39541105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档