Директивы препроцессора для разных типов экранов в Objective c? - PullRequest
0 голосов
/ 07 декабря 2011

Мне нужно различать экраны сетчатки или обычные экраны в моем приложении для 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 голосов
/ 07 декабря 2011

Тебе это не нужно.Прежде всего, препроцессор не поможет определить экран 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

0 голосов
/ 07 декабря 2011

Вы не можете сделать это с препроцессором. Вы можете определить свой собственный символ, но я не уверен, что вы будете делать тогда. Как-то сказать Apple, разные версии приложения работали на разных устройствах?

Лучше сделать это во время выполнения. Посмотрите на свойство UIScreen scale.

Конечно, обычно вам не нужно этого делать, как говорится в другом ответе. Большинство функций UIKit добавят @ 2x для вас. В некоторых случаях необходимо знать, когда в игру вступает свойство scale.

0 голосов
/ 07 декабря 2011

Директивы препроцессора разрешаются во время компиляции.В вашем примере это означает, что компилятор не будет выбирать между этими блоками кода, когда он работает на iphone, он будет решать, когда вы создадите свое приложение.Поэтому, если вы создаете разные приложения для каждой платформы, вам придется определить это во время выполнения.

Я уверен, что есть способ узнать, на какой версии iOS / iPhone вы работаете.Просто сделайте это, когда вы инициализируете свое приложение или когда вам понадобится этот код, а затем используйте if / else, если там.

0 голосов
/ 07 декабря 2011

Нет, ты не.Не с UIImage, он делает это для вас.

...