2016-09-16 55 views
4

好吧,我知道這是新的爲大家,但我覺得這是一個簡單的概念 - 我下面這個在這裏做一個定製貼紙消息應用程序擴展名:MessageAppExtension:如何從資產加載貼圖圖像到MSStickerBrowserView?

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

伊夫精確複製一切,我試圖創建一個基本MSStickerBrowserView顯示(後來使用邏輯過濾,但還沒有嘗試的還)貼PNG圖像我有我的資產文件夾的位置:

enter image description here

本教程並沒有從ASSE加載TS似乎而是剛剛從他們的項目,而不管他們的代碼是老如下:

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

這些都是我試着無論他們的名字來加載圖片:

enter image description here

+0

好吧,但看看我的問題的錯誤 - 我如何加載我的資產文件夾的內容與此? – skyguy

+0

對不起,這個新的 – skyguy

+0

在Swift 3中它應該是Bundle.main.url(forResource:String?,withExtension:String?) – azimov

回答

4

該教程不使用資產目錄的原因是你調用bundle上的urlForResource方法時,無法獲取放置在.xcassets文件夾中的圖像的有效fileURL。

您需要單獨添加您的資產,就像您將其他文件引入應用程序一樣。在該點上調用pathForResource或urlForResource將不再返回nil。

編輯:這是一個函數,將採取文件夾名稱,循環它的內容並返回[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") 

代碼得到了斯威夫特替換3

0

你可以把圖片文件夾中,像這樣(XCODE視口):

enter image description here

它使事情更有條理,但不需要儘可能多的代碼,就像你將它們放在一個.xcasset中一樣。

它可以通過創建一個新的組而不是創建一個。xcasset通過(右鍵點擊消息擴展,然後單擊新建組):

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 

    } 

} 

(詩不是我的博客,卻發現它在谷歌和它已經非常有用)

相關問題