Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Load image from iOS 8 framework

Tags:

swift

ios8

I'm trying to load an image from an iOS 8 framework that I'm writing (in Swift). I'm using Xcode 6 Beta 6

This code does not work (i.e. load image) if the image is stored in my framework's Images.xcassets:

let image = UIImage(named: "Background.png") 

If the image is stored in an Images.xcassets of a host application (that uses the framework), then the image is loaded properly (from code inside the framework).

I can see that the framework's Images.xcassets is included in the Copy Bundle Resources phase.

I'm also using a storyboard file as a resource in the framework; and this loads properly.

I've tried renaming the Images.xcassets of the framework to avoid some kind of naming collision with the host application, but this doesn't work either.

like image 570
Daniel Avatar asked Sep 09 '14 08:09

Daniel


2 Answers

While @Renatus answer is perfectly valid and addresses the core issue (bundle for framework needs to be specified), I wanted to post the solution I went with since it's slightly more direct:

Swift 3.0/4.0/5.0

let image = UIImage(named: "YourImage", in: Bundle(for: YOURFRAMEWORKCLASS.self), compatibleWith: nil) 

Alternatively, you can use this pattern for non-class, aka non-"static", functions:

let image = UIImage(named: "YourImage", in: Bundle(for: type(of: self)), compatibleWith: nil) 

or this pattern for class functions:

let image = UIImage(named: "YourImage", in: Bundle(for: self), compatibleWith: nil) 

These alternatives are better for cutting and pasting.

like image 179
Daniel Avatar answered Sep 19 '22 16:09

Daniel


UIImage(named: "Background.png") calls NSBundle.mainBundle() in the internals. So, your code is trying to find resource in your host app's bundle, not in the frameworks bundle. To load UIImage from your framework's bundle use this snippet:

let frameworkBundle = NSBundle(forClass: YOURFRAMEWORKCLASS.self) let imagePath = frameworkBundle.pathForResource("yourImage.png", ofType: "") if imagePath != nil {   result = UIImage(contentsOfFile: imagePath!) } 

Edited: added explanation (thx to milz)

like image 27
Renatus Avatar answered Sep 18 '22 16:09

Renatus