2013-06-04 65 views
9

当从属性检查器中预设图像视图的源时,文件的实际路径何时/如何解析?似乎没有任何呼叫NSBundle,但我可能是错的。当从Interface Builder设置UIImageView的图像时,该图像如何加载?

编辑:我试图调整任何方法被调用(如果可能)以后动态替换资产。

enter image description here

+1

岂不只是相对于视图控制器是捆绑? – borrrden

+1

也许它调用[UIImage imageNamed:]?我不是一个忍者忍者,所以我不知道你是如何覆盖它的。 – morningstar

+0

不错的猜测,但它似乎并没有使用该方法。 – kasrak

回答

9

无的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:

+0

是的...所以有没有办法改变像imageNamed一些方法? – jerrygdm

+0

你可以调整它,但对于这个特定的任务,你将无法获得利润 –

+1

关于“IB将原始图像数据打包到XIB中”的评论没有任何意义。我只看了一个已编译的故事板,发现图像数据没有内联到输出文件BYZ-38-t0r-view-8bC-Xf-vdC.nib中。实际上,查看“hexdump -C BYZ-38-t0r-view-8bC-Xf-vdC.nib”的输出表明PNG的文件名出现在编译的文件中。所以,它必须通过同一个包中的文件名来加载文件数据。 – MoDJ

2

的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; 
+0

是的,但没有任何所谓的获取方法路径? (见我编辑的动机)。 – kasrak

+0

@kasrak,你想要的图像overflow.png的路径?它是否在主包中? –

+0

我不认为我是很清楚的。我想知道当它从故事板/ xib中加载它时,运行时如何实际初始化UIImageView。这将允许自动替换应用程序中的图像,而无需更改任何代码。 – kasrak

相关问题