【问题标题】:Preprocessor directives for different types of screens in Objective c?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

有什么想法吗?

【问题讨论】:

标签: objective-c ios4 version preprocessor-directive


【解决方案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 上的资源是如何加载的,所以我添加了第二个示例以防万一
    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 2012-06-08
    • 2012-11-29
    • 2013-08-02
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多