当从属性检查器预先设置图像视图的源时,解析文件的实际路径的时间/方式是什么?似乎没有任何对NSBundle的调用,但我可能错了。
编辑:我正在尝试调用任何被调用的方法(如果可能的话),以便以后动态替换资产。
答案 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;