2016-05-23 22 views
9

Ho un progetto Xcode ordinario come questo ...Come ottenere array di UIImage, dalla cartella, in Swift?

enter image description here

avviso c'è una cartella (si tratta di una cartella reale - non solo un gruppo) che si chiama "immagini". Contiene 25 immagini ".png".

Tutto ciò che voglio fare è creare una matrice diUIimage con ciascuna di queste immagini.

(O anche, un array dei nomi di immagine o simili, che sarebbe bene - allora potrebbe caricarli UIImage(named:)

Come faccio a ottenere in quella cartella "immagini" ?? Che dire di una sottocartella "immagini/auto"?

Ho provato qualcosa di simile ma non trova nulla ...

override func viewDidLoad() 
    { 
    let imageArray = NSBundle.mainBundle().URLsForResourcesWithExtension(
      "png", subdirectory: "images") 
    print("test...") 
    for n:NSURL in imageArray! 
     { print("found ..." ,n) } 
    } 
+0

Puoi confermare che le immagini vengono caricate nel pacchetto dell'app? –

+0

dai un'occhiata a questa risposta: http://stackoverflow.com/questions/30584992/programmatically-access-image-assets – user3353890

risposta

5

Noi ci assumiamo le immagini sono in resource bundle dell'app. In caso contrario, è necessario assicurarsi che la directory delle immagini sia elencata in "Copia risorse pacchetto" nella "Fasi di creazione" del target.

enter image description here

EDIT Questo è solo andare copiare le immagini nel fascio app, se si richiede la cartella da copiare al fascio applicazione per il codice qui sotto quindi si prega di utilizzare il seguire StackOverflow question per impostarla correttamente.

Questo ci fornisce una serie di URL che possiamo quindi utilizzare con UIImage (data :) e NSData (contentsOfURL :) per creare l'immagine quando necessario.

ottenere il percorso delle risorse del fascio e aggiungere la directory di immagine quindi ottenere il contenuto della directory.

 if let path = NSBundle.mainBundle().resourcePath { 

     let imagePath = path + "/images" 
     let url = NSURL(fileURLWithPath: imagePath) 
     let fileManager = NSFileManager.defaultManager() 

     let properties = [NSURLLocalizedNameKey, 
          NSURLCreationDateKey, NSURLLocalizedTypeDescriptionKey] 

     do { 
      let imageURLs = try fileManager.contentsOfDirectoryAtURL(url, includingPropertiesForKeys: properties, options:NSDirectoryEnumerationOptions.SkipsHiddenFiles) 

      print("image URLs: \(imageURLs)") 
      // Create image from URL 
      var myImage = UIImage(data: NSData(contentsOfURL: imageURLs[0])!) 

     } catch let error1 as NSError { 
      print(error1.description) 
     } 
    } 
+0

Risposta impressionante. Le immagini sono decisamente nelle "Copy Bundle Resources". Ma non c'è nessuna cartella in là (non ci sono cartelle in "Copy Bundle Resources" - solo singoli elementi). Quindi il codice non funziona per me. Semplicemente getta l'errore ... – Fattie

+0

Va bene - è una scelta organizzativa. –

+0

Ma come posso inserire una CARTELLA nelle risorse del pacchetto di copie? Non riesco a trascinarlo lì dentro. – Fattie

1

Mi sconsiglio di caricare tutte le immagini in un array in una volta. Le immagini tendono ad essere grandi ed è facile a corto di memoria e crash.

A meno che assolutamente avere tutte le immagini nella memoria in una sola volta è meglio tenere una serie di percorsi o URL e caricare le immagini una alla volta, se necessario.

Supponendo che la cartella piena di immagini è nel vostro pacchetto applicazione, è possibile utilizzare il metodo NSBundle URLsForResourcesWithExtension:subdirectory: per ottenere un array di NSURL s per tutti i file nella sottodirectory images, sia con un specifico tipo di file, o tutti i file (se passate nil per l'estensione.)

Una volta ottenuta una matrice di URL di file, è possibile mapparla a una serie di percorsi, se necessario, quindi mappare a in una serie di immagini.

+0

hi Duncan, certo che mi limiterò caricare i percorsi. Va bene comunque. (Una serie di piccole immagini non sarebbe un problema.) Il problema che mi sembra di avere è come ottenere una "cartella nel pacchetto di app" - guardando in CopyBundleResources, sembrano essere solo singoli elementi. Notare il frammento di codice nella parte inferiore della mia risposta .. sembra non fare nulla ?? – Fattie

+0

Ahh. deve ESSERE IN "Risorse /" !!!!!!! .. ?? – Fattie

+0

Quando crei una cartella (non un gruppo) come mostri nel tuo screenshot, dovresti selezionare la cartella, andare nel pannello di ispezione e assicurarti che "Target membership" sia selezionato per il target che crea la tua app. Quindi Xcode dovrebbe copiare la cartella di immagini nel pacchetto di app (come una cartella). La chiamata NSBundle nella mia risposta dovrebbe darti una serie di NSURL che puoi quindi fare con qualsiasi cosa tu voglia. (mappare una serie di percorsi, mappare una serie di immagini, conservare come URL e caricarli secondo necessità, ecc.) –

3

Joe.

Prova come seguenti:

La mia situazione attuale è la seguente. enter image description here

  1. Devi registrarti per le immagini di "copiare Bundle Risorse".

  2. È necessario aggiungere il modulo filtro nel pacchetto principale. enter image description here

Si sta lavorando così dalla mia parte. Forse puoi cambiare il filtro dal formato "jpg" in "png".

Ho provato su iOS 10.x più tardi, Swift 3.0 e xcode 8.1 versione. Se avete qualche problema, per favore contattatemi.

+0

Grazie - necessario esattamente questo. Sei fantastico! – skyguy

Problemi correlati