资产命名为iPhone和iPad

时间:2012-10-24 01:58:55

标签: iphone objective-c ios ipad

是否可以拥有一个名为architecture.png的图像资源,并将其重命名为架构为iPad版本的ipad.png?并仍然在代码中使用它:

[UIImage imageWithName:@"architecture.png"];

这会为iPad版本寻找架构~ipad吗?

2 个答案:

答案 0 :(得分:5)

如果您的应用中有两个图片资源:

  • “architecture.png”(iPhone版)
  • “architecture~ipad.png”(iPad版)

然后

[UIImage imageWithName:@"architecture.png"]

在iPhone / iPad设备上自动加载正确的

(正如DOOManiac正确注意到的,这适用于iOS 4及更高版本。)

有关详细信息,请参阅Resource Programming Guide中的“iOS支持特定于设备的资源”。

答案 1 :(得分:3)

<强>更新

link iOS支持特定于设备的资源,看起来这可以从iOS 4.0开始实现。

  

在iOS 4.0及更高版本中,可以标记单个资源文件   仅适用于特定类型的设备。这种能力   简化了您必须为通用应用程序编写的代码。   而不是创建单独的代码路径来加载一个版本的   iPhone的资源文件和iPad的不同版本的文件,   你可以让bundle-loading例程选择正确的文件。所有   你要做的就是适当地命名你的资源文件。

     

要将资源文件与特定设备相关联,请添加   自定义修饰符字符串到其文件名。包含此修饰符   string生成具有以下格式的文件名:

     

<basename><device>.<filename_extension>

     

<basename>字符串表示资源的原始名称   文件。它还表示从中访问文件时使用的名称   你的代码。同样,<filename_extension>字符串是标准   文件扩展名用于标识文件的类型。 <device>   string是区分大小写的字符串,可以是以下之一   值:

     

~ipad - 资源只能在iPad设备上加载。

     

~iphone - 应在iPhone或iPod touch上加载资源   仅限设备。

     

您可以将设备修饰符应用于任何类型的资源文件。对于   例如,假设您有一个名为MyImage.png的图像。要指定   您将创建适用于iPad和iPhone的不同版本的图像   名为MyImage~ipad.png和MyImage~iphone.png的资源文件   并将它们包含在您的捆绑包中。要加载图像,你会   继续在代码中将资源称为MyImage.png并让   系统选择适当的版本,如下所示:

     

UIImage* anImage = [UIImage imageNamed:@"MyImage.png"];在iPhone上   或iPod touch设备,系统加载MyImage~iphone.png资源   文件,在iPad上,它加载MyImage~ipad.png资源文件。如果一个   系统找不到特定于设备的资源版本,系统会崩溃   返回寻找具有原始文件名的资源,其中包含   前面的例子是一个名为MyImage.png的图像。

对于支持iOS的设备&lt; 4.0,你可以按照以下方法。但我认为不再需要它了。仍保持原样。

我能想到的一个解决方案是,通过为iPad定义一个宏来为每个图像文件添加~ipo.png。然后在将此方法用作[UIImage imageWithName:imageName(@"architecture")];时始终调用此宏,这会将其转换为iPhone的[UIImage imageWithName:@"architecture.png"];和iPad的[UIImage imageWithName:@"architecture~ipad.png"];

例如: -

#define IMAGENAME(Name) (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)?[(Name) stringByAppendingString:(@"~ipad.png")]:[(Name) stringByAppendingString:(@".png")]

然后将其用作[UIImage imageWithName:IMAGENAME(@"architecture")];

它也可以定义为,

#define IMAGENAME(Name) (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)?[(Name) stringByReplacingOccurrencesOfString:@".png" withString:@"~ipad.png"]:(Name)

然后将其用作[UIImage imageWithName:IMAGENAME(@"architecture.png")];

另一个解决方案是子类UIImage类并覆盖imageWithName方法以在此处实现此逻辑。您需要在名称参数中搜索.png并将其替换为适用于iPad的~ipad.png。之后,您可以直接将其用作iPad和iPhone的[UIImage imageWithName:@"architecture.png"]。这也可以通过在categoryNSObject上创建UIImage来实现。我认为没有其他方法可以实现这一目标。