是否可以有一个名为 architecture.png 的图像资产并将其重命名为 architecture~ipad.png 用于 iPad 版本?并且仍然在代码中使用它:
[UIImage imageWithName:@"architecture.png"];
那么这会为iPad版本寻找架构〜ipad吗?
是否可以有一个名为 architecture.png 的图像资产并将其重命名为 architecture~ipad.png 用于 iPad 版本?并且仍然在代码中使用它:
[UIImage imageWithName:@"architecture.png"];
那么这会为iPad版本寻找架构〜ipad吗?
如果您的应用中有两个图像资源:
然后
[UIImage imageWithName:@"architecture.png"]
将自动在 iPhone/iPad 设备上加载正确的。
(正如 DOOManiac 正确注意到的那样,这适用于 iOS 4 及更高版本。)
For more information, see "iOS Supports Device-Specific Resources" in the Resource Programming Guide.
更新:
从链接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。这也可以通过创建category
onNSObject
或来实现UIImage
。我认为没有其他方法可以实现这一目标。