是否可以拥有一个名为architecture.png的图像资源,并将其重命名为架构为iPad版本的ipad.png?并仍然在代码中使用它:
[UIImage imageWithName:@"architecture.png"];
这会为iPad版本寻找架构~ipad吗?
答案 0 :(得分:5)
如果您的应用中有两个图片资源:
然后
[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"]
。这也可以通过在category
或NSObject
上创建UIImage
来实现。我认为没有其他方法可以实现这一目标。