【问题标题】:Image resources for iOSiOS的图片资源
【发布时间】:2012-09-03 08:37:55
【问题描述】:

我可能在这里遗漏了一些明显的东西,但我一直无法解决以下问题:

我有一个项目,其中包含普通屏幕和视网膜屏幕的图像资源,例如 someimage.pngsomeimage@2x.png,它们存储在单独的包中。当我构建项目时,Xcode 会自动将它们打包到一个多页 tiff (imageName.tiff) 中,我已经在 finder 中检查了它——它实际上是包含两个图像的多页 tiff。然而,这里出现了一个问题:我很难加载适当的资源。

我做的是:

    NSString * imageName = ... ;

    NSLog(@"imageName: %@", imageName);

    UIImage * someImage = [UIImage imageNamed: imageName];

我也喜欢辅助方法,它返回资源包:

   +(NSBundle *) resourcesBundle
   {
         NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"MyResourcesBundle" withExtension:@"bundle"]];
         return bundle;
   }

我已经尝试关注imageName

imageName = [[AuxClass resourcesBundle] pathForResource:@"someimage" ofType:@"png"];

在这种情况下,我有null 用于imageName

imageName = [[AuxClass resourcesBundle] pathForResource:@"someimage" ofType:@"tiff"];

在这种情况下会返回实际的图像路径,但它仅在我使用 imageWithContentsOfFile 而不是 imageNamed 时才有效,并且它不占用适当的资源:尽管屏幕类型不同,但它会为视网膜加载资源。

如果我省略了文件类型(就像我在添加 @2x 资源之前所做的那样,它工作正常,并且是我尝试的第一件事并且确信它会工作)

imageName = [NSString stringWithFormat: @"%@/%@",
                                  @"MyResourcesBundle.bundle"",
                                  @"someimage" ];

什么都没有加载。

添加“.tiff”扩展名与pathForResource:的效果相同 - 加载视网膜资源,不考虑非视网膜屏幕资源。

那么我错过了什么?加载图片的正确方法是什么?

【问题讨论】:

  • 能否请您更新问题,这样人们就不会与“Xcode 自动将它们打包到单个多页 tiff (imageName.tiff) 中的“按预期”混淆,正如预期的那样(我已经检查过它在查找器中 - 它实际上是带有两个图像的多页 tiff)"。

标签: objective-c ios xcode png tiff


【解决方案1】:

您是否尝试过使用以下方法简单地加载图像:

UIImage * someImage = [UIImage imageNamed: @"someimage"];

(假设您的项目中有一个名为“someimage”的图像,例如 someimage.png)

代码将根据平台自动选择视网膜/非视网膜版本。

如果问题是创建了 TIFF,请检查:

在最新版本的 XCode 中,转到编辑器菜单,然后选择“验证设置”,这应该会删除该艺术品组合。

【讨论】:

  • 是的,我确实尝试过,但我猜它不起作用,因为捆绑包中没有“someimage.png” - png 文件被打包到单个多页 tiff 中
  • 也许我不明白你为什么这样打包。这样做的目的是什么?
  • 您可以禁用该功能,不是吗?顺便检查一下:stackoverflow.com/questions/3332981/…
  • 会很好,但是我还没找到
  • 提示:您甚至可以从参数中远程获取文件扩展名,使其比其他一些逻辑更清晰,并允许您在不更新代码的情况下更改文件格式。
【解决方案2】:

多页 TIFF 仅适用于 OSX;它们在 iOS 上不起作用

因此,您需要停止尝试访问本质上无法访问的资源,并以正确的方式做事!

您需要打开生成外部资源包的项目,选择目标,进入构建设置,然后进入部署子标题,将“组合高分辨率艺术品”设置为否。然后重新编译外部资源包。

在您的主项目中,您现在应该能够以正常方式读取 PNG。

【讨论】:

  • 好的,我找到了问题所在。如果您没有看到该设置,请在捆绑设置中将基本 SDK 更改为 Mac OS X,然后将设置更改为 no,然后将基本 SDK 更改回 iOS。即使该选项不可用,它似乎仍会在构建期间应用。
  • 我在构建设置中搜索“combine”并找到设置为“YES”的“COMBINE_HIDPI_IMAGES”。我将其设置为“否”,它停止组合图像。
【解决方案3】:

如果您正在使用捆绑包,请转到

-> 构建设置 -> COMBINE_HIDPI_IMAGES 为 NO,

您只需要清理和构建!

【讨论】:

    【解决方案4】:

    -> 构建设置 -> COMBINE_HIDPI_IMAGES 为 NO

    这是唯一有效的解决方案,无需进行其他更改

    【讨论】:

      【解决方案5】:

      当您为应用创建图像时,假设您正在创建一个名为 example 的图像。

      您应该保存以下内容:

      • example~iphone.png -> 这是针对非视网膜 iPhone 的
      • example~iphone@2x.png -> 这是针对视网膜 iPhone 的
      • example~ipad.png -> 这是针对非视网膜 iPad 的
      • example~ipad@2x.png -> 这是针对 Retina iPad 的

      所以,不管你从哪里调用它,你只要这样调用它,假设 myImageView 是一个 UIImageView 对象:

      [myImageView setImage:[UIImage imageNamed:@"example"]];
      

      Apple 强烈建议您使用 png 图像。此外,操作系统会负责为所需设备找到正确的图像。您无需担心找到路径和所有这些东西。 +(UIImage*)imageNamed:(NSString*)name 在您的资源包中查找正确的图像 - 顺便说一下,要返回包含您的资源的包,只需调用 [NSBundle mainBundle];

      【讨论】:

      • 好吧,这基本上是我尝试的第一件事——它让我无法理解为什么这不起作用。我确实使用 png 图像 - 它们由 xcode 自动打包到 tiff 中。我不使用[NSBundle mainBundle],因为我有一个单独的图片资源包。
      猜你喜欢
      • 1970-01-01
      • 2015-04-30
      • 2023-03-12
      • 2019-07-17
      • 2015-08-02
      • 1970-01-01
      • 2014-05-22
      • 2012-08-03
      • 2014-08-21
      相关资源
      最近更新 更多