12

当从属性检查器预先设置图像视图的源时,何时/如何解析文件的实际路径?似乎没有对 NSBundle 的任何调用,但我可能错了。

编辑:我正在尝试调配调用的任何方法(如果可能)以稍后动态替换资产。

在此处输入图像描述

4

2 回答 2

10

没有UIImage调用任何初始化程序或工厂。
我使用调试器(在 iOS Simulator 7.0.3 上)进行了一些研究,发现以下内容:
1)UIImageView在 IB 中设置的通过-initWithCoder:.
2) IninitWithCoder:方法decodeObjectForKey:被调用。并且 (!) 命名的键UIImage包含来自 IB 的图像。此图像是UIImageView通过 ivar 设置的,而不是通过setImage:setter 设置的。
因此,似乎 IB 在编译时将原始图像数据打包到 XIB / Storyboard 中。废话,但真实。
这就是为什么我们不能 swizzle+imageNamed:或其他一些工厂,应该使用条件代码来为retina4 和 iOS6 设置图像

编辑:

评论显示编译的 IB 文件的 hexdumping 里面有 png 名称。

实际上,查看“hexdump -C BYZ-38-t0r-view-8bC-Xf-vdC.nib”的输出表明编译后的文件中出现了PNG的文件名。因此,它必须通过来自同一个包的文件名加载文件数据。

但是,它们仍然是通过一些内部机制加载的,而不是通过imageNamed:

于 2013-12-09T22:19:54.360 回答
3

iOS 会自动overflow.png在与您的 xib 文件相同的包中查找您的文件。如果您的 xib 文件只是在应用程序的目标中,那么默认情况下它会在主包中查找。

如果您想以编程方式将新图像加载到图像视图中并且您的图像位于主包中:

UIImage *image = [UIImage imageNamed:@"MyAwesomeImage"];
self.imageView.image = image;

如果您的图像在另一个包中:

NSBundle *imageBundle = ... // [NSBundle mainBundle] if your image is inside main bundle
NSString *imagePath = [imageBundle pathForResource:@"MyAwesomeImage" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
self.imageView.image = image;
于 2013-06-04T02:00:11.013 回答