【问题标题】:Subclass UIImage imageNamed:?子类 UIImage imageNamed:?
【发布时间】:2012-09-24 22:32:43
【问题描述】:

我正在为 iPhone 5 提供支持。我很清楚 Interface Builder 中有 iOS 6 的自动布局功能。不过,这很好,如果是 iPhone 5,有时我想加载我自己的图像。

因此,我的 iPhone 游戏中的某些图像正好是屏幕尺寸 (320x480) 或 (640 x 960)。因此,如果我使用的是 iPhone 5,这些图像将不会覆盖整个屏幕。所以我要为这些全屏图像制作 (640 x 1136) 图像。

现在我知道,如果我只是将图像命名为:MyImage-568h@2x.png,它将不会加载。那么,我将如何子类化 UIImage 以便它加载不是默认图像的 -568h@2x 图像?

谢谢!

【问题讨论】:

    标签: ios image cocos2d-iphone iphone-5


    【解决方案1】:
    1. 懒惰的方式:

      UIImage * img = [UIScreen mainScreen].bounds.size.height > 500 ? [UIImage imageNamed:@"Default-568h.png"] : [UIImage imageNamed:@"Default.png"];
      

      我在一个应用程序中完成了这项工作,其中没有摄像头的设备上的主屏幕是Default.png;它看起来并不 hacky,因为无论如何我们都需要更改 Default.png 以支持新设备。

    2. 不那么懒惰的方法:以您需要填充的空间为条件,而不是屏幕尺寸。

    3. 您要求的解决方案并不足以保证一个类的通用性,但无论如何都在这里:

      @implementation MyImage
      +(UIImage)imageNamed:(NSString*)name {
        if ([UIScreen mainScreen].bounds.size.height > 500) {
          UIImage * img = [UIImage imageNamed:[name stringByAppendingString:@"-iPhone5"];
          if (img) { return img; }
        }
        return [UIImage imageNamed:name];
      }
      @end
      

      真的没有必要继承 UIImage。如果你觉得真的 hacky,你可以补丁/swizzle/otherwise +[UIImage imageNamed:] 指向一个自定义方法,但我真的不建议这样做,除非调试。

    【讨论】:

    • #1 的问题是我的应用也支持 iPad,因此会导致返回错误的 UIImage。我不是#2的忠实粉丝,但这是一种可能性。 #3 似乎不错,除了 #1 的问题,这也是我询问子类的唯一原因,因为我将在多个视图中加载 iPhone 5 自定义资产,所以我只调用一个共享方法。如果有一种方法#1 可以在没有这个问题的情况下工作,那就走那条路。
    • 如果屏幕高于 700 像素,那就是 iPad!或者你也可以使用UI_USER_INTERFACE_IDIOM()
    • 我很困惑。对于 UI_USER_INTERFACE_IDIOM,只有当它是 iPhone 或 iPad 时才会返回,仅此而已。它不会告诉我它是否是 iPhone 5。我仍然对通过 bounds.height 进行检查感到困惑。
    • bool isiPhone5 = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone && [UIScreen mainScreen].bound.height > 500);
    • 明白了,但 iPhone 5 没有特定的高度,我可以检查以缩短代码吗?
    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    相关资源
    最近更新 更多