我需要区分iPhone应用程序中的视网膜屏幕或普通屏幕,类似于:
#if TARGET_OS_IPHONE_VERSION < 3
NSString *uniquePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"close.png"];
UIImage *image = [UIImage imageWithContentsOfFile: uniquePath];
#endif
#if TARGET_OS_IPHONE_VERSION >= 4
NSString *uniquePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"close@2X.png"];
UIImage *image = [UIImage imageWithContentsOfFile: uniquePath];
#endif
有什么想法吗?
答案 0 :(得分:0)
不,不。不是用UIImage,它就是为你做的。
答案 1 :(得分:0)
您无法使用预处理器执行此操作。你可以定义自己的符号,但我不确定你会做什么。不知何故告诉Apple不同版本的应用程序在不同的设备上运行?
最好是在运行时这样做。查看UIScreen
scale
属性。
当然,正如另一个答案所说,通常你不需要这样做。大多数UIKit功能都会为你添加@ 2x。您需要知道一些极端情况,即scale
属性发挥作用的时间。
答案 2 :(得分:0)
预编译器指令在编译时解析。在您的示例中,这意味着当编译器在iphone上运行时,编译器不会在这些代码块之间做出决定,它将决定何时构建应用程序。因此,除非您为每个平台构建不同的应用程序,否则您必须在运行时确定它。
我确信有办法让你正在运行哪个版本的iOS / iPhone。只需在初始化应用程序时或在需要此代码时执行此操作,然后使用if / else(如果有)。
答案 3 :(得分:0)
你不需要这个。首先,预处理器无法定义Retina屏幕,因为它们是在编译时定义的。但无论如何,由于Apple惯例,你不需要它。只需在项目中使用“close.png”就足够了
NSString *uniquePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"close.png"];
UIImage *image = [UIImage imageWithContentsOfFile: uniquePath];
我想你只想要这个
UIImage *image = [UIImage imageNamed:@"close.png"];
如果在构建项目时,close.png(和双倍大小close@2x.png)在项目中,则第二个样本是要使用的样本。测试它,您将看到视网膜手机将显示@ 2x文件