Objective c中不同类型屏幕的预处理程序指令?

时间:2011-12-07 16:21:06

标签: objective-c ios4 version preprocessor-directive

我需要区分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

有什么想法吗?

4 个答案:

答案 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文件