2014-09-14 4 views
14

Ich habe https://github.com/fulldecent/FDChessBoardView funktioniert gut und bin jetzt das Projekt erneut von Grund auf mit pod lib create starten, um eine Podspec zu machen.Erstellen einer Cocoapod-Bibliothek und [UIImage imageNamed:] gibt NULL

Es gibt eine {'.h', '. M'} Datei und einige Bilder. Die Bilder befinden sich im Dateisystem im bereitgestellten Pod/Assets-Ordner. Die Ressourcen werden in der podspec Datei festgestellt, mit:

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

(ich habe auch versucht, diese Dateien direkt in die Development Pods/FDChessboardView/Resources Gruppe innerhalb XCode hinzufügen.)

Im Inneren der Bibliothek Implementierungsdatei ich auf diese Bilder beziehen müssen . Ich habe versucht:

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]; 

Hier ist der ImagePath korrekt eingestellt. Diese Datei existiert und file bestätigt es ein PNG ist:

[...] aa.png: PNG-Bilddaten, 182 x 164, 8-Bit/Farbe RGBA, non-interlaced

Das UIImage ist jedoch NULL.

Ich habe versucht, auch diese:

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

Alle von ihnen NULL produzieren.

Könnte mir jemand helfen, mich in die richtige Richtung zu weisen, wie man Themenbild-Assets lädt?

Vielen Dank!

Will

+0

Sie in Ihrem Paket enthalten ein Asset Katalog Sind? – Wilmar

+0

Hast du das jemals herausgefunden? Ich habe viel zu lange damit verbracht, das gleiche Problem zu lösen ... – Rob

Antwort

10

Ok - ich eine Lösung gefunden, die für mich funktioniert:

Im lib ich die Schaffung bin, ich habe die folgende Klasse: AEBubbleField.hAEBubbleView.m

ich in die auch ein Bild haben Assets Ordner der generierten Dateistruktur namens background.png. Ich will das oben so in meinen lib-Dateien verwenden ich folgendes in der pod spec add (um sicherzustellen, das png mit meiner lib Klasse kopiert)

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

ich dann das Bild auf folgende Weise zugreifen kann :

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]; 

Dies ist der einzige Weg, wie ich das Bild bekommen und es verwenden kann. Alle anderen Methoden, die ich versucht habe, geben einfach nil wie die ursprüngliche Frage zurück.

+1

Das hat für mich funktioniert! Vielen Dank! Das einzige, was ich anders gemacht habe, war '[NSBundle bundleForClass: [self class]]'. Mein Albtraum ist vorbei. – egarc

+0

Schön! Ich bin froh, dass ich helfen konnte - und das ist ein besserer Ansatz, also werde ich meine Antwort aktualisieren;) – Rob

+0

Ich wollte hinzufügen, dass in diesem Fall das Ergebnis der Verwendung von Frameworks erfordert Ressourcen aus dem Framework-Bundle und nicht die "MainBundle" zugegriffen werden. Es gibt einige gute Lektüre [hier] (http://blog.cocoapods.org/CocoaPods-0.36/), die mir geholfen haben zu verstehen, was passiert ist. – egarc

0

Robs Antwort nicht für mich arbeiten, ich glaube, weil ich nicht in pod lib create

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

Ich konnte den Ressourcenpaket-Setup aus dem Standard geändert habe Bilder von diesem Ressourcenbündel laden, hatte aber um es explizit zu definieren.

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

Wenn Sie mit Swift 2> können Sie auf diese Weise Zugang:

// 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

In einer Pod-Bibliothek wird nicht das richtige "Bundle" gefunden. Dieses Bundle ist das Hauptpaket, nicht das Paket mit den Pod-Ressourcen. –

2

diese Antwort für mich funktioniert.
https://stackoverflow.com/a/34324540/1897767

und mein SWIFT-Code ist:

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 
}