无法从 CocoaPods 中的 .xcasset 加载图像

Posted

技术标签:

【中文标题】无法从 CocoaPods 中的 .xcasset 加载图像【英文标题】:Can't load images from .xcasset in CocoaPods 【发布时间】:2015-10-11 09:01:11 【问题描述】:

我正在创建一个 pod,并且我有一个想要使用的图像资产目录。 在我的 .podspec 文件中,我将其设置为:

s.resource_bundles = 
  'MyPodResources' => ['*.xcassets']

Images.xcassets 位于 pod 的根目录中。

当我尝试使用 imageNamed() 加载图像时,它只是无法正常工作。我没有收到错误或警告,但没有显示图像。

这是有趣的部分 - 如果我尝试在示例应用程序的 Main.storyboard 中添加图像,我可以选择该图像并且它在 Interface Builder 中显示良好。但是,当我运行示例应用程序时,图像不可见。

我查看了 GH 上的所有问题,但仍然找不到解决方案……这是 Xcode 7/ios 9 问题吗?

谢谢!

【问题讨论】:

好像是目标会员的问题 什么是'imageLoad'?如果您使用 imageNamed 函数,它会从默认包加载图像,因此您必须直接指定 MyPodResources 包才能从那里加载图像。尝试使用这个问题的解决方案:***.com/questions/26158980/… @Iyuna 抱歉,意思是 imageNamed。将尝试从捆绑包中加载它,但在我的研究过程中,我发现 CocoaPods 不需要这些信息 - 它应该以某种方式自动包含捆绑包...... 你搞清楚了吗? @KingPolygon 感谢您提醒我 - 我实际上已经解决了,请在下面查看我的答案。 【参考方案1】:

最后我为UIImage写了一个扩展,放到pod目录下。它看起来像这样:

class func bundledImage(named: String) -> UIImage? 
    let image = UIImage(named: named)
    if image == nil 
        return UIImage(named: named, inBundle: NSBundle(forClass: MyBasePodClass.classForCoder()), compatibleWithTraitCollection: nil)
     // Replace MyBasePodClass with yours
    return image

我像这样使用它: imageView.image = UIImage.bundledImage("icon-grid")

就是这样,希望有人觉得这很有用!

【讨论】:

【参考方案2】:

我遇到了同样的问题,发现了一条关于 .podspec 文件的小而重要的信息

我试图使用故事板中 .xcassets 内的 pod 包中的图像,它会在故事板中显示正常,但是当我运行应用程序时它会崩溃,说它找不到资源。

我将我的 podspec 更改为包含 s.resources 以及 s.resource_bundles

s.resource_bundles = 
  'SDKRes' => ['SDK/Assets/*']


s.resources = ['SDK/Assets/*.xcassets']

然后它能够​​从情节提要中正确加载资源

【讨论】:

谢谢你 Fonix ,经过一番挣扎,你救了我。【参考方案3】:

在 Swift 3 中:

let bundle: Bundle = Bundle(identifier: "Framework Bundle ID")!
yourImageView.image =  UIImage(named: "imageNameInAssets", in: bundle, compatibleWith: nil)

【讨论】:

【参考方案4】:

我碰到了这个问题,用下面的方法解决了。

Assets.xcassets 无法加载

一开始我把我的图标图片放在 Assets.xcassets 中,但是我无法读取其中的图片。

改用 .bundle

将您的图标图像打包。创建捆绑包很容易。

    创建一个文件夹。 将您的图片复制到此文件夹中。 添加 .bundle 作为该文件夹的副标题 将此 .bundle 拖入您的项目中

在您的 .podspec 中编辑资源

s.resource_bundles = '<YourBundleName>' => ['*.bundle']

请注意,如果您在此处输入不同的名称,则会重命名您的捆绑包!

创建一个类来帮助您将图像打包

class ImageHelper 
static func image(_ name: String) -> UIImage? 
    let podBundle = Bundle(for: ImageHelper.self) // for getting pod url
    if let url = podBundle.url(forResource: "<YourBundleName>", withExtension: "bundle")  //<YourBundleName> must be the same as you wrote in .podspec
        let bundle = Bundle(url: url)
        return UIImage(named: name, in: bundle, compatibleWith: nil)
    
    return UIImage()

获取您的图像

ImageHelper.image("<YourImageName>")

希望这会有所帮助。

【讨论】:

以上是关于无法从 CocoaPods 中的 .xcasset 加载图像的主要内容,如果未能解决你的问题,请参考以下文章

从 Xcode Swift 中 Assets.xcassets 中的文件夹访问图像

xcassets 中的所有图像,然后如何加载从我的包中的 nib 引用的图像

从 xcassets 中的图像创建 URL 总是返回 nil

从 xcassets 文件中的图像创建 CPTImages

从 Xcode 项目中意外删除了 xcassets 文件

在 cocoapods 中加载 resource_bundle 错误