【问题标题】:When a UIImageView's image is set from Interface Builder, how is that image loaded?当从 Interface Builder 设置 UIImageView 的图像时,该图像是如何加载的?
【发布时间】:2013-05-30 07:16:26
【问题描述】:

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

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

【问题讨论】:

  • 它不只是相对于视图控制器所在的包吗?
  • 也许它调用了[UIImage imageNamed:]?我不是 swizzle ninja,所以我不知道你可以如何覆盖它。
  • 猜的不错,不过好像没用那个方法。
  • 您找到解决方案了吗? pathForResourceimageNamed 都没有被调用...此外,UIImage 上的initWithContentsOfFile: 没有被调用
  • 不,没弄明白

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


【解决方案1】:

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;

【讨论】:

  • 是的,但是有没有调用任何方法来获取路径? (见我编辑动机)。
  • @kasrak, 你想要图片overflow.png的路径吗?它在主包中吗?
  • 我想我不是很清楚。我想知道运行时从情节提要/xib 加载 UIImageView 时如何实际初始化它。这将允许在不更改任何代码的情况下自动替换应用中的图像。
  • @andi 有一个错字。试试 self.imageView.image
【解决方案2】:

UIImage 初始化程序或工厂都没有被调用。
我使用调试器(在 iOS Simulator 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:

【讨论】:

  • 是的......所以没有办法像 imageNamed 那样混合一些方法?
  • 你可以随意调配,但对于这个特定的任务,你不会获得任何利润
  • 关于“IB将原始图像数据打包到XIB”的评论没有意义。我刚刚查看了一个编译的storyboard,发现图像数据没有内联到输出文件BYZ-38-t0r-view-8bC-Xf-vdC.nib中。实际上,查看“hexdump -C BYZ-38-t0r-view-8bC-Xf-vdC.nib”的输出表明编译后的文件中出现了PNG的文件名。因此,它必须通过同一包中的文件名加载文件数据。
  • @MoDJ 感谢您的评论,我已经适当地更新了答案。但是,我要求您更谨慎地对待您的措辞。 “这没有意义”与其说是建设性的,不如说是辱骂性的。
  • 滥用? Petro,您在文章中断言内联 PNG 数据是“无稽之谈,但确实如此”。我纠正你的错误结论不是滥用,而是苏格拉底的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多