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, и это было очень полезно)

  • вернуть массив объекта с помощью Alamofire
  • «Скрытый» vs #keyPath (UIView.isHidden)
  • Как создать не округленный угол UIProgressView в ios с помощью Swift
  • Swift3 & Xcode8: «индекс» недоступен: нельзя индексировать String с CountableClosedRange <Int>,
  • Как получить код страны с помощью NSLocale в Swift 3
  • Получить цвет пикселя при касании
  • Unarchived Node не появляется при добавлении родителя в SpriteKit
  • Совместное использование Live Photo на WhatsApp в Swift 3 с использованием UIActivityViewController не работает
  • Тип «Любой?» не имеет элементов подписи (используя Firebase)
  • Гетерогенный литерал коллекции может быть выведен только в «»; добавьте явное аннотацию типа, если это преднамеренное
  • Подробнее / Меньше с Swift 3
  • Interesting Posts

    iOS. Длительное нажатие и перетаскивание для выбора другой кнопки. (Как и клавиатура)

    Обратный вызов прогресса анимации ядра

    UIImagePickerController + Cropping: что позволяет делать Editing, а что нет?

    ALAssetLibrary, он показывает только частичное количество фотографий во всех фотографиях на некоторых устройствах

    iOS AudioServicesPlayAlertSound без звука с наушниками

    @IBDesignable view не рисует цвет фона внутри Interface Builder

    Возврат полного состояния с помощью метки mark.administrativeArea с использованием reverseGeocodeLocation

    Рисование кривой Безье между множеством заданных точек

    Экран iOS не работает?

    Как архивировать / экспортировать Framework в Xcode?

    Загруженный Xcode 6.3 из магазина, но 6.2 все еще запущен

    GCD, NSThread и performSelector: onThread: проблемы

    iPad-клавиатура меняет окно просмотра при изменении ориентации

    Как добавить изображения в UIMarkupTextPrintFormatter?

    Включить переключение uiimageview через горизонтальное uiscrollview

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.