2016-09-16 2 views
4

Хорошо, я знаю, что это новое для всех, но я думаю, что это было бы простое понятие - я после этого здесь, чтобы сделать заказ наклейка расширение сообщения приложения:MessageAppExtension: как загрузить изображения наклейки из активов в MSStickerBrowserView?

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

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

enter image description here

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

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 has no member URLforResource

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

Ошибка:

enter image description here

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

enter image description here

+0

Хорошо, но посмотрите на мой вопрос об ошибке - как я могу загрузить содержимое содержимого моей папки с этим? – skyguy

+0

К сожалению, это не так. – skyguy

+0

В Swift 3 это должен быть Bundle.main.url (forResource: String ?, withExtension: String?) – azimov

ответ

4

Причина, по которой учебник не использует каталоги активов является то, что вам не может получить действительный файл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") 

Пожалуйста, обратите внимание, чтобы не включать слэш («/») в начале имя папки.

+0

Да, я понял это, но хочу добавить папку, полную конкретных изображений и прокручивать их (не только отдельные изображения). Я до сих пор не могу найти папку, потому что у папок нет никаких расширений, поэтому вы не можете использовать urlForResource - как я могу это сделать? – skyguy

+0

@skyguy - Я добавил функцию, которая выполняет то, что вам нужно. Я протестировал его в примере проекта и смог выполнить итерацию через папку и создать наклейки с изображениями, добавленными только в расширение. – BJHStudios

+0

Не заставить его работать ... где должна быть папка? – skyguy

1

Просто замените "resourceUrl" с:

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

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

0

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

enter image description here

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

Это можно сделать, создав новую группу вместо создания.xcasset по (Extension Щелчок правой кнопкой мыши сообщения и нажав New Group):

enter image description here

Следующий код 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, и это было очень полезно)