当从Interface Builder设置UIImageView的图像时,该图像如何加载?
当从属性检查器中预设图像视图的源时,文件的实际路径何时/如何解析?似乎没有任何呼叫NSBundle,但我可能是错的。当从Interface Builder设置UIImageView的图像时,该图像如何加载?
编辑:我试图调整任何方法被调用(如果可能)以后动态替换资产。
无的UIImage
初始化程序或工厂正在调用。
我用调试器(在iOS模拟器7.0.3)做了一些研究,发现如下:
1)UIImageView
在IB中设置的是通过-initWithCoder:
初始化的。
2)在initWithCoder:
方法decodeObjectForKey:
被调用。和(!)键名为UIImage
包含来自IB的图像。此图像通过ivar设置为UIImageView
,而不是通过setImage:
设置。
因此,似乎在编译时IB会将原始图像数据打包到XIB/Storyboard中。胡说八道,但是确实如此。
这就是为什么我们不能调酒+imageNamed:
或一些其他工厂,应该使用条件代码来设置图像的retina4和iOS6的
编辑:
评论显示编译IB的文件,它hexdumping已经为png名内。
事实上,寻找的输出 “进制打印-C BYZ-38-t0r - 视图 - 8bC-XF-vdC.nib” 表示 PNG的文件名显示在编译的文件。因此,它必须通过相同包中的文件名加载文件数据 。
然而,他们仍然通过一些内部机制加载,而不是通过imageNamed:
的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;
岂不只是相对于视图控制器是捆绑? – borrrden
也许它调用[UIImage imageNamed:]?我不是一个忍者忍者,所以我不知道你是如何覆盖它的。 – morningstar
不错的猜测,但它似乎并没有使用该方法。 – kasrak