Storyboard, UIImageView. Load image from bundle

十年热恋 提交于 2019-12-06 04:56:11

So, based on answers to this question, I do know of one solution. Sounds like you've already done some of this, but just in the interest of giving a complete answer:

  1. Create a framework project to house your shared images (it's great for shared code too!): File > New > Project > iOS > Cocoa Touch Framework.
  2. Create a new Asset Catalogue within the framework File > New > File > iOS > Resource > Asset Catalogue.
  3. Import your images into the Asset Catalogue.
  4. Create a new workspace: File > New > Workspace.
  5. Add both your app and the framework to the workspace: File > Add Files to WorkspaceName.
  6. Include the framework as an 'Embedded Binary' within the app's project: Click the blue project file icon in the project navigator, go to the General project settings and locate Embedded binaries. Click + and select the Framework from the list (e.g. ExampleFramework.framework).

The above should be enough to allow you to use images from the framework's Asset Catalogue when they are called using code...

let frameworkBundle = Bundle(for: FrameWorkClass.self)
guard let image = UIImage(named: "MyImage", in: frameworkBundle, compatibileWith: nil) else { ... }

...however, to use it in a storyboard or XIB, there's one more step needed. Whilst the image names will now be selectable from Interface Builder (and even display there when selected), storyboards can only reference their own bundles, so it'll give you the following error when the app runs, and the image will be missing:

Could not load the "ImageName" image referenced from a nib in the bundle with identifier "BundleName"

To fix this, you need to go to the Workspace's navigator (left panel) and drag the Asset Catalogue (i.e. the .xcassets file) from the framework to somewhere within the app project itself (e.g. the project's root folder). In the dialog that appears, be sure that your app is checked in the Add to targets list, and that you leave the following option unchecked.

This will create a reference in your app's main bundle to the Asset Catalogue in the framework, but without creating a duplicate of it.

Once you've done that, you can use the images from that catalogue just like any other within your storyboards & XIBs.

Honestly, I can't vouch for if this is a best-practice, but it's the only way I've found to achieve what I also feel to be a sensible means of minimizing duplication between projects. In case you're interested, I've posted a question here to try and determine if this causes any duplication of the assets on build.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!