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

Posted

技术标签:

【中文标题】Objective c中不同类型屏幕的预处理器指令?【英文标题】:Preprocessor directives for different types of screens in Objective c? 【发布时间】:2011-12-07 16:21:05 【问题描述】:

我需要在我的 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

有什么想法吗?

【问题讨论】:

可能重复:***.com/questions/3294100/… 【参考方案1】:

不,你没有。不使用 UIImage,它会为您做到这一点。

【讨论】:

UIImage 肯定会为捆绑的图像做到这一点。【参考方案2】:

你不能用预处理器来做。你可以定义自己的符号,但我不确定你会做什么。不知何故告诉 Apple 不同版本的应用在不同设备上运行?

最好在运行时进行。查看UIScreenscale 属性。

当然,正如其他答案所说,通常您不需要这样做。大多数 UIKit 函数都会为你添加 @2x。您需要了解一些极端情况,这就是 scale 属性发挥作用的时候。

【讨论】:

不错,比例尺非常适合。【参考方案3】:

预处理器指令在编译时解析。在您的示例中,这意味着编译器在 iphone 上运行时不会在这些代码块之间做出决定,它将决定您何时构建应用程序。因此,除非您为每个平台构建不同的应用程序,否则您必须在运行时确定这一点。

我确信有一种方法可以获取您正在运行的 ios/iPhone 版本。只需在您初始化应用或需要此代码时执行此操作,然后在此处使用 if/else。

【讨论】:

【参考方案4】:

你不需要这个。首先,预处理器无助于定义 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文件

【讨论】:

他正在从 Documents 目录中加载它。它看起来像是未捆绑在应用程序中的外部资源。 是的,这就是我包含第一个代码示例的原因。但是从他的问题(加载“close.png”似乎是构建时通常包含的 UI 文件),我不确定他是否真的了解 iOS 上的资源是如何加载的,所以我添加了第二个示例以防万一

以上是关于Objective c中不同类型屏幕的预处理器指令?的主要内容,如果未能解决你的问题,请参考以下文章

你可以嵌套 C 预处理器指令吗?

[精通Objective-C]预处理器

Fortran 预处理器指令用法

不同项目中不同文件的预处理器指令(常量)

C#将类类型保存为预处理器

Objective C Animation 我想在屏幕上移动动画