2

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

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

那么这会为iPad版本寻找架构〜ipad吗?

4

2 回答 2

5

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

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

然后

[UIImage imageWithName:@"architecture.png"]

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

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

For more information, see "iOS Supports Device-Specific Resources" in the Resource Programming Guide.

于 2012-10-24T21:40:46.730 回答
3

更新:

链接iOS Supports Device-Specific Resources 看来,从 iOS 4.0 开始,这似乎是可能的。

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

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

<basename><device>.<filename_extension>

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

~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 < 4.0 的设备,您可以按照以下方法进行操作。但我认为不再需要它了。仍然保持原样。

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

例如:-

#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。之后,您可以直接将其[UIImage imageWithName:@"architecture.png"]用于 iPad 和 iPhone。这也可以通过创建categoryonNSObject或来实现UIImage。我认为没有其他方法可以实现这一目标。

于 2012-10-24T04:05:35.990 回答