12

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

我的问题是——

  1. 我知道 -

      [UIImage imageNamed:@"blabla"]
    

将自动搜索要在 iPhone 上显示的正确图像(视网膜与否)。

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

是否可以 ?

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

谢谢

沙尼

4

4 回答 4

66

如果您正在加载名为“image”的图像,则搜索路径可能与以往相同:

苹果手机:

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

平板电脑:

  • 1) image@2x~ipad.png (仅视网膜)
  • 2) image@2x.png(仅限视网膜)
  • 3) 图片~ipad.png
  • 4) 图像.png
于 2012-03-09T01:40:59.363 回答
17

没有很好的内置方法可以不为 iPad 复制更高分辨率的 iphone 视网膜图像。您可以编写自己的 UIImage 扩展或子类,使用用户界面惯用语宏来确定您的平台,然后自动将“@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"]
于 2011-02-23T10:01:32.980 回答
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]];
}
于 2011-12-21T23:47:25.533 回答
0

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

于 2011-10-11T12:48:21.857 回答