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 不同版本的应用在不同设备上运行?
最好在运行时进行。查看UIScreen
scale
属性。
当然,正如其他答案所说,通常您不需要这样做。大多数 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中不同类型屏幕的预处理器指令?的主要内容,如果未能解决你的问题,请参考以下文章