在通用应用程序中使用@ 2x视网膜图像用于ipad?苹果更喜欢原生应用吗?

时间:2011-02-23 09:18:57

标签: iphone ipad universal-binary

我知道有一些关于此的讨论,但我找不到好的答案?

我的问题是 -

  1. 我知道 -

      [UIImage imageNamed:@"blabla"]
    
  2. 将自动搜索要在iPhone上显示的正确图像(视网膜或非视网膜)。

    我有一个通用应用程序,我希望在ipad上使用@ 2x版本,所以我不必加载其他版本的图像(我有数百个小图像)。

    有可能吗?

    • 我在某些地方看到人们写道苹果不鼓励使用环球应用,因为它更喜欢为iPhone和iPad构建独立的应用程序?即使我为每个人创建不同的用户界面,这是正确的吗?

    感谢

    SHANI

4 个答案:

答案 0 :(得分:66)

如果您要加载名为“image”的图片,搜索路径可能与以往一样:

iPhone:

  • 1)image@2x~iphone.png(仅限视网膜)
  • 2)image@2x.png(仅限视网膜)
  • 3)image~iphone.png
  • 4)image.png

ipad公司:

  • 1)image@2x~ipad.png(仅限视网膜)
  • 2)image@2x.png(仅限视网膜)
  • 3)image~ipad.png
  • 4)image.png

答案 1 :(得分:17)

没有很好的内置方法可以不为iPad复制更高级别的视频网络图像。您可以编写自己的UIImage扩展或子类,使用用户界面idiom宏来确定您的平台,然后自动将“@ 2x”附加到图像名称:

+ (UIImage *) imageNamedSmart:(NSString *)name
{
    if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
        return [UIImage imageNamed:[NSString stringWithFormat:@"%@@2x.png", name]];
    return [UIImage imageNamed:[NSString stringWithFormat:@"%@.png", name]];
}

你会这样称呼它:

[UIImage imageNamedSmart:@"myImage"]

答案 2 :(得分:3)

我通过检查视网膜图像是否存在改进了Bogatyr的答案。可能没有过分必要,但我发现它在测试时很有用,所以我可以创建一个图像文件。

+ (UIImage *) imageNamedSmart:(NSString *)name {
    NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease];
    NSString *retinaFileName = [NSString stringWithFormat:@"%@@2x", name];

    NSString *filePath = [[NSBundle mainBundle] pathForResource:retinaFileName ofType:@"png"];

    if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && [fileManager fileExistsAtPath:filePath]) {
        return [UIImage imageNamed:[retinaFileName stringByAppendingString:@".png"]];
    }
    return [UIImage imageNamed:[NSString stringWithFormat:@"%@.png", name]];
}

答案 3 :(得分:0)

也许你可以将所有图片资源image@2x.png复制到image~ipad.png。 注意“~ipad.png”的情况。 但您必须使用Cap(stretchableImageWithLeftCapWidth:topCapHeight :)手动管理拉伸图像。