2015-09-15 9 views
12

in cocoapod Bibliothek verwenden habe ich eine cocoapod Bibliothek, die Vermögenswerte in 2 Formaten enthält:Wie Bilder Asset Katalog für iOS

  • ein .storyboard
  • XCode Asset Katalog .xcassets (mit Bildern)

meine podspec-Datei enthält die Definition für das Ressourcenpaket:

s.resource_bundle = {'SparkSetup' => ['Resources/**/*.{xcassets,storyboard}']} 

und ich habe ein separates Ziel im Pod-Projekt, um ein Ressourcenbündel zu erstellen, indem ich diese Dateien und eine PLIST-Datei für dieses Paket verwende.

Sache ist, dass, wenn ich den Pod in einem App-Projekt verwende - ich kann die Storyboard/XCassets-Dateien in der Pod-Ziel sehen und ich kann auf das Storyboard zugreifen und leicht ausführen, aber die Bilder im Storyboard referenziert. xcaseset-Datei) werden zur Laufzeit nicht gefunden (aber in IB korrekt angezeigt).

Fehler ich erhalte, ist:

Could not load the "spinner" image referenced from a nib in the bundle with identifier "(null)" 

ich eine Bundle-Datei in das Verzeichnis für den Artikel sehen tun. Um instanziiert VCs im Storyboard Ich benutze:

+(NSBundle *)getResourcesBundle 
{ 
    NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"SparkSetup" withExtension:@"bundle"]]; 
    return bundle; 
} 


+(UIStoryboard *)getSetupStoryboard 
{ 
    UIStoryboard *setupStoryboard = [UIStoryboard storyboardWithName:@"setup" bundle:[SparkSetupMainController getResourcesBundle]]; 
    return setupStoryboard; 
} 

, die zum Auffinden des Storyboard gut zu funktionieren scheint, aber nicht für Bilder in der .xcassets im gleichen Bündel zu finden.

Was mache ich falsch? Wie kann ich Bilder aus diesem Storyboard/Code referenzieren und diesen UI-Pod in jede App integrieren?

Danke!

+0

genau die gleiche Having Problem. Ich habe festgestellt, dass es funktioniert, wenn ich Bilder ohne Asset-Katalog verwendet. – bencallis

+1

@bencallis anscheinend ist dies die einzige Lösung. XCode scheint nicht auf einen Asset-Katalog zu verweisen, der nicht im Haupt-App-Bundle geladen ist. Die einzige Lösung besteht darin, die Ressource_Bundle-Zeile in podspec so zu ändern, dass sie .png's und nicht '.xcasset' enthält und jedes Bild einzeln referenziert. nicht perfekt, aber das ist die einzige Art, wie es funktioniert .. – mindbomb

+0

Auch dieses Problem. Bilder können nicht einmal mit imageNamed aus einem xcasset-Katalog im Pod geladen werden. :( – Jure

Antwort

7

Nun, Image-Asset-Kataloge werden nicht über Schoten unterstützt - nur ein Ressourcenbündel enthalten, die Ihr Bild enthält Dateien in Ihrem podspec wie so:

s.subspec 'Resources' do |resources| 
    resources.resource_bundle = {'MyBundle' => ['Resources/**/*.{png}']} 

end 

und die Bilder zugreifen sicher aus der Schote wie folgt aus:

+(NSBundle *)getResourcesBundle 
{ 
    NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle bundleForClass:[self class]] URLForResource:@"MyBundle" withExtension:@"bundle"]]; 
    return bundle; 
} 


+(UIImage *)loadImageFromResourceBundle:(NSString *)imageName 
{ 
    NSBundle *bundle = [MyClass getResourcesBundle]; 
    NSString *imageFileName = [NSString stringWithFormat:@"%@.png",imageName]; 
    UIImage *image = [UIImage imageNamed:imageFileName inBundle:bundle compatibleWithTraitCollection:nil]; 
    return image; 
} 

Das löst alle Probleme beim Umgang mit Bildern/Ressourcen in einem Cocoapod.

+2

ist es möglich, die Bilder aus dem Storyboard auch so zu bekommen? – swalkner

+0

@swalkner im Storyboard müssen Sie '' 'MyBundleName.bundle/ .png''' in' '' UIImageView'' Bild ID hinzufügen, Es wird nur in der Laufzeit verfügbar sein. –

3

wenn Sie swift verwenden.

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 
} 
17

Mindestens ab Version 1.0.1 von Cocoapods werden Image-Asset-Kataloge unterstützt.

In meinem Swift Code, habe ich:

public static var GoogleIcon:UIImage { 
    let bundle = NSBundle(forClass: self) 
    Log.msg("bundle: \(bundle)") 
    return UIImage(named: "GoogleIcon", inBundle: bundle,compatibleWithTraitCollection: nil)! 
} 

In meinem pod spec, habe ich:

s.resources = "SMCoreLib/Assets/*.xcassets" 

Wenn ich den Simulator bauen mit der.Auto-Datei tut im Rahmen zeigen:

cd /Users/<snip>/SMCoreLib.framework 
ls 
Assets.car Info.plist SMCoreLib 
+0

In der Tat funktioniert das jetzt .. – mindbomb

+1

s.resources = "SMCoreLib/Assets/*. xcassets" das hat meine Zeit gerettet, danke :) –

+0

Ja, aber das enthält Ressourcen innerhalb Ihres Anwendungsziels und nicht als Teil des Pod-Frameworks. – MichK

1

Swift 3-Version

private func getImageFromBundle(name: String) -> UIImage { 
    let podBundle = Bundle(for: YourClass.self) 
    if let url = podBundle.url(forResource: "YourClass", withExtension: "bundle") { 
     let bundle = Bundle(url: url) 
     return UIImage(named: name, in: bundle, compatibleWith: nil)! 
    } 
    return UIImage() 
} 
0

Update für Swift 4

public struct ImagesHelper { 
    private static var podsBundle: Bundle { 
    return Bundle(for: YourClass.self) 
    } 

    private static func imageFor(name imageName: String) -> UIImage { 
    return UIImage.init(named: imageName, in: podsBundle, compatibleWith: nil)! 
    } 

    public static var myImage: UIImage { 
    return imageFor(name: "imageName") 
    } 

es dann wie unten verwenden:

ImagesHelper.myImage 

Wie in den @Chris Prince ‚s Antwort, vergessen Sie nicht Ihre podspec Datei zu aktualisieren, wie: (Definieren Sie den genauen Pfad der Datei xcassets nach Ihrem Projekt-Setup)

s.resource_bundles = { 
    'YourPodName' => ['YourPodName/Assets/Assets.xcassets'] 
    } 
Verwandte Themen