2014-09-14 4 views
14

Ho un ottimo https://github.com/fulldecent/FDChessBoardView e sto iniziando di nuovo il progetto da zero con pod lib create per creare un Podspec.Creazione di una libreria Cocoapod e [UIImage imageNamed:] restituisce NULL

C'è un file {'.h', '. M'} e alcune immagini. Le immagini si trovano nel file system nella cartella Pod/Assets fornita. Le risorse sono indicati nel file podspec con:

s.resource_bundles = { 
    'FDChessboardView' => ['Pod/Assets/*'] 
} 

(ho anche provato ad aggiungere direttamente i file nel gruppo Development Pods/FDChessboardView/Resources all'interno XCode.)

All'interno del file di implementazione della libreria ho bisogno di fare riferimento a queste immagini . Ho provato:

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"FDChessboardView" ofType:@"bundle"]; 
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath]; 
NSString *imagePath = [bundle pathForResource:@"aa" ofType:@"png"]; 
UIImage* image = [UIImage imageWithContentsOfFile:imagePath]; 

Qui imagePath è impostato correttamente. Questo file esiste e file conferma è un PNG:

[...] aa.png: dati di immagine PNG, 182 x 164, 8-bit/RGBA colore, non interlacciata

Tuttavia UIImage è NULL.

Ho anche provato questi:

image = [UIImage imageNamed:@"aa"]; 
UIImage *image = [UIImage imageNamed:@"FDChessboardView.bundle/aa.png"]; 
image = [UIImage imageNamed:@"aa" inBundle:bundle compatibleWithTraitCollection:nil]; 

Tutti loro producono NULL.

Qualcuno può aiutarmi a indicarmi la direzione corretta su come caricare gli asset delle immagini dei temi?

Grazie!

Will

+0

Si sta utilizzando un catalogo di asset nel vostro pacco? – Wilmar

+0

Lo hai mai capito? Ho passato troppo tempo a cercare di risolvere lo stesso problema ... – Rob

risposta

10

Ok - ho trovato una soluzione che funziona per me:

Nel lib sto creando, ho la seguente classe: AEBubbleField.hAEBubbleView.m

Ho anche un'immagine nella Cartella Assets della struttura file generata denominata background.png. Voglio usare questo nei miei file lib sopra in modo da aggiungere il seguente alla specifica pod (per garantire il PNG è copiato con le mie classi lib)

s.ios.resource_bundle = { 'AEBubbleField' => 'Pod/Assets/*.png' }

posso quindi accedere all'immagine nel modo seguente :

NSBundle *bundle = [NSBundle bundleForClass:[self class]]; // Any class in the lib can be used here, I just went for the current class 
UIImage *backgroundImage = [UIImage imageNamed:@"background.png" inBundle:bundle compatibleWithTraitCollection:nil]; 

Questo è l'unico modo per ottenere l'immagine e utilizzarla. Tutti gli altri metodi che ho provato semplicemente restituiscono nil come la domanda originale.

+1

Questo ha funzionato per me! Grazie! L'unica cosa che ho fatto diversamente era '[NSBundle bundleForClass: [self class]]'. Il mio incubo è finito. – egarc

+0

Bello! felice di poter aiutare - e questo è un approccio migliore, quindi aggiornerò la mia risposta;) – Rob

+0

Ho voluto aggiungere che in questo caso, il risultato dell'utilizzo di framework richiede l'accesso alle risorse dal bundle del framework e non dal 'mainBundle'. C'è una buona lettura [qui] (http://blog.cocoapods.org/CocoaPods-0.36/) che mi ha aiutato a capire cosa stava succedendo. – egarc

0

risposta di Rob non ha funzionato per me, penso, perché non ho cambiato il programma di installazione pacchetto di risorse dal default in pod lib create

s.resource_bundles = { 
    'PodCore' => ['Pod/Assets/*.png', 
        'Pod/Classes/**/*.xib', 
        'Pod/Classes/**/*.storyboard'] 
} 

ero in grado di caricare le immagini da questo pacchetto di risorse, ma aveva per definirlo esplicitamente.

NSString *bundleURL = [[NSBundle mainBundle] pathForResource:@"PodCore" 
                 ofType:@"bundle"]; 
NSBundle *podBundle = [NSBundle bundleWithPath:bundleURL]; 
UIImage *image = [UIImage imageNamed:@"home_black.png" 
          inBundle:podBundle 
     compatibleWithTraitCollection:nil]; 
1

Se stai usando Swift 2> è possibile accedere a questo modo:

// should access the bundle for this class 
let bundle = NSBundle(forClass: self.classForCoder) 
// successfully loaded image 
let myImageToUse = UIImage(named: "image", inBundle: bundle, compatibleWithTraitCollection: nil) 
+0

Questo non ha il giusto 'Bundle' in una libreria pod, quel bundle è il principale, non quello con le risorse del pod. –

2

questa risposta funziona per me.
https://stackoverflow.com/a/34324540/1897767

e, il mio codice swift è:

class func loadImage(name: String) -> UIImage? { 
    let podBundle = NSBundle(forClass: MyClass.self) 
    if let url = podBundle.URLForResource("MyBundleName", withExtension: "bundle") { 
     let bundle = NSBundle(URL: url) 
     return UIImage(named: name, inBundle: bundle, compatibleWithTraitCollection: nil) 
    } 
    return nil 
}