MessageAppExtension: как загружать изображения наклейки из активов в MSStickerBrowserView?

Хорошо, я знаю, что это новое для всех, но я бы подумал, что это будет простая концепция – я следую за этим здесь, чтобы создать специальное приложение для приложений наклейки:

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

Ive полностью скопировал все, и я пытаюсь создать базовое отображение MSStickerBrowserView (затем более поздняя фильтрация с использованием логики, но еще не сделанная) наклейки, которые у меня есть в папке с моими ресурсами здесь:

введите описание изображения здесь

Учебник не загружался из активов, а скорее из их проекта, независимо от того, как их код устарел, как здесь:

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) } } } } 

Я получаю ошибку

Bundle не имеет URL-адреса URL для Resource

Я ничего не могу найти по этому поводу. Как я могу просто отображать мои наклейки программным способом в приложении?

Ошибка:

введите описание изображения здесь

Это изображения Im, пытающиеся загрузить независимо от их имени:

введите описание изображения здесь

3 Solutions collect form web for “MessageAppExtension: как загружать изображения наклейки из активов в MSStickerBrowserView?”

Причина, по которой учебник не использует каталоги активов, заключается в том, что вы не можете получить действительный файлURL для изображений, помещенных в папку .xcassets при вызове метода urlForResource в комплекте.

Вам нужно добавить свои активы отдельно, как и другие файлы, которые вы вводите в приложение. Вызов pathForResource или urlForResource в комплекте в этой точке больше не будет возвращать нуль.

EDIT: вот функция, которая будет принимать имя папки, перебирать содержимое и возвращать [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" на:

 let url = Bundle.main.url(forResource: "Sticker \(i)", withExtension: "png") 

Код был заменен в Swift 3.

Вы можете поместить изображения в такую ​​папку (XCODE Viewport):

введите описание изображения здесь

Это делает вещи более организованными, но не нуждается в таком коде, как если бы вы поместили их в .xcasset.

Это можно сделать, создав новую группу вместо создания .xcasset с помощью («Нажатие правой кнопки мыши» и нажав «Новая группа»):

введите описание изображения здесь

Следующий код для 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. Не мой блог, но нашел его на google, и это было очень полезно)

  • Невозможно воспроизвести звук, записанный с помощью голоса, используя AVCaptureAudioDataOutputSampleDelegate
  • Xcode раскадровка маскирует элементы uitabbarcontroller с синим цветом
  • UnsafePointer больше не работает в swift 3
  • Использование isKindOf в Swift
  • Застрял в импорте и использовании Swift ViewController для класса Objective C.?
  • iOS Swift Email Deep Linking
  • swift 3 error
  • UIImagePickerController сбой приложений | Swift3, Xcode8
  • ABAddressBook fromOpaque (_ :) в Swift 3
  • Двойная кнопка Tap или Use для переключения камеры с обратной стороны на передний (Xcode 8, Swift 3)
  • Обнаружение подключения к Интернету и отображение UIAlertview Swift 3
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.