我有一个主项目包含 10 多个捆绑包。我有两个名为map_bubble_right_normal
的图像,一个在主捆绑包中,另一个在子捆绑包(SCommon.bundle)中。我编写的代码如下:
UIImage *image = [UIImage imageNamed:@"map_bubble_right_normal"];
代码是在AppDelegate
didFinishLaunchingWithOptions
编写的。
我想加载我保存在主捆绑包中的图像。但是,从子捆绑包(SCommon.bundle)加载图像的代码的结果。
我想保存在主捆绑包中的图像可能是错误图像(可能是复制问题)。因此,我显示 ipa 内容以查看保存在根目录中的"map_bubble_right_normal"文件。图像是正确的!!!!
我不知道为什么imageNamed:
会从子捆绑包(SCommon.bundle)加载图像。我尝试删除应用程序并重新启动iPhone,结果是一样的。并且,我尝试删除XCode的派生数据,并清理项目。映像仍从子捆绑包(SCommon.bundle)加载。
此外,我在iOS 8和iOS 9设备上测试了问题。
到目前为止,只有更改 bundleId(主捆绑包)的方法才能暂时解决问题。
我知道UIImage的缓存功能,但我不明白为什么会发生奇怪的场景。
我真诚地向你祈求一位伟大的上帝的帮助。谢谢~
谢谢大家的回答。对不起,我误导了我们所有人捆绑。
我找到了问题的原因。错误图像不是来自子捆绑包,子捆绑包来自 Assets.car。问题的原因实际上应该归咎于物理目录中的Image.assert。CocoaPods 会将所有匹配的"*.assets"复制到 Assets.car。
我在苹果开发者论坛上提出了同样的问题,并找到了问题的关键提示。
相对于问题 Cocoapods 复制资源脚本的问题会覆盖默认的 xcasset bahaviour。
如果您的 Pod Repo 添加了名称与*.xcassets
匹配的任何文件夹,Pod_resources.sh脚本将复制 Pod_Root 中的每个*.xcassets
。
Pod_resources.sh密钥代码:
if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ]
...
# Find all other xcassets (this unfortunately includes those of path pods and other targets).
OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d)
while read line; do
if [[ $line != "`realpath $PODS_ROOT`*" ]]; then
XCASSET_FILES+=("$line")
fi
...
fi
如果您的 Pod 添加了任何xcassets
文件,则条件XCASSET_FILES
将得到满足。
要从主捆绑包加载图像,请尝试以下操作:
UIImage *image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"map_bubble_right_normal" ofType:@"png"]];
如果你想从mainBundle加载,试试这个代码:
NSBundle* myBundle = [NSBundle mainBundle];
NSString* myImage = [myBundle pathForResource:@"Seagull" ofType:@"jpg"];
如果要从子捆绑包加载:
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"YourBundleName" ofType:@"bundle"];
NSBundle *subBundle = [NSBundle bundleWithPath:bundlePath];
NSString* myImage = [subBundle pathForResource:@"Seagull" ofType:@"jpg"];
参考这里
我遇到了一些同样的情况。而不是您上面提到的两个捆绑包,我未能显示具有确切正确名称的正确图像。最后,我发现关键点是图像的后缀是jpg
而不是png
。我换了个png
的形象,一切都变好了。也许这是你可能发生的情况。试一试,祝你好运。:)
PS:这里有一个相关链接作为参考。