从Interface Builder设置UIImageView的图像时,该图像是如何加载的?

时间:2013-06-04 01:48:44

标签: ios cocoa-touch uiimageview interface-builder nsbundle

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

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

enter image description here

2 个答案:

答案 0 :(得分:9)

UIImage初始化程序或工厂都没有被调用 我用调试器(iOS模拟器7.0.3)进行了一些研究,发现如下:
1)在IB中设置的UIImageView通过-initWithCoder:初始化 2)在initWithCoder:方法decodeObjectForKey:中调用。名为UIImage的(!)键包含来自IB的图像。此图片通过ivar设置为UIImageView,而不是通过setImage: setter设置 因此,似乎IB在编译时将原始图像数据打包到XIB / Storyboard中。胡说八道,但确实如此 这就是为什么我们不能调动+imageNamed:或其他工厂,应该使用条件代码为retina4和iOS6设置图像

修改

注释显示已编译的IB文件的hexdumping内部有png名称。

  

实际上,看看“hexdump -C”的输出   BYZ-38-t0r-view-8bC-Xf-vdC.nib“表示文件名   PNG出现在已编译的文件中。因此,它必须加载文件数据   通过同一捆绑包中的文件名。

但是,它们仍然通过某种内部机制加载,而不是通过imageNamed:

加载

答案 1 :(得分:3)

iOS会自动在与xib文件相同的捆绑包中查找您的文件overflow.png。如果您的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;