Значки Retina (@ 2x) не используются, когда изображения указаны в коде - PullRequest
13 голосов
/ 09 августа 2010

Я помещаю изображение play.png на свой вид. Когда представление первоначально загружается, iPhone 4 берет соответствующий файл play@2x.png и выглядит великолепно. Однако, когда я нажимаю кнопку воспроизведения, мой код заменяет ее на файл pause.png. Затем, когда я нажимаю pause.png, чтобы вернуть play.png, он использует оригинальный файл play.png (а не версию @ 2x, как я думал, она автоматически ссылается).

Это код, который я пытался использовать:

[button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];

Итак, если я поменяю местами файлы после начальной загрузки представления, нужно ли вручную указывать версию @ 2x внутри оператора IF? Если да, то является ли UIScreen.scale лучшим атрибутом для этого?

Я сейчас использую такой код:

if ([UIScreen mainScreen].scale > 1.0) 
{ 
    [button setImage:[UIImage imageNamed:@"play@2x.png"] forState:UIControlStateNormal]; 
} 
else 
{ 
    [button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal]; 
}

Работает нормально, но наличие оператора IF раздражает и выглядит немного хрупким.

Заранее благодарим всех вас, умнички.

Ответы [ 9 ]

25 голосов
/ 11 августа 2010

Условное утверждение не требуется.Следующей строки достаточно:

[button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];

В iOS 4.0 метод imageNamed: автоматически ищет суффикс имени файла «@ 2x», если устройство является iPhone 4 и имеет дисплей сетчатки.В предыдущих версиях iPhone OS метод imageNamed: ищет только то, что вы пишете (то есть изображение с низким разрешением).Это работает, потому что iPhone 4 не может иметь более низкую версию ОС, чем 4.0, поэтому у пользователей экрана Retina всегда будет изображение с более высоким разрешением.

7 голосов
/ 27 сентября 2010

Вы можете использовать только:

[UIImage imageNamed:@"play"]

Без расширения.Это загрузит версию @ 2x, если она доступна, и если устройство имеет масштаб x2.

Это будет работать для iOS4 или терки.Однако, если вы хотите запустить приложение в предыдущих версиях, вы можете сделать следующее:

UIImage* image = [UIImage imageNamed:@"play"]; // for iOS 4 or greater
if(!image)
    image = [UIImage imageNamed:@"play.png"]; // for previous iOS versions

Преимущество состоит в том, что это будет работать, если в любой момент у вас будет @ 3x или любая другая версия, если Apple создаст новые устройстваили отображает.

Вы можете создать служебный метод, чтобы избежать этого везде, где вам нужно загрузить изображение.

См .: Поддержка экранов высокого разрешения , раздел «ЗагрузкаИзображения в ваше приложение "

4 голосов
/ 17 сентября 2010

Две глупые ошибки (обе из которых я сделал раньше), которые могут вызвать эту проблему:

  1. Случайно назвав маленький версии @ 2x вместо больших те
  2. Наличие больших версий слегка пропущено (на один пиксель)
3 голосов
/ 23 августа 2010

Я столкнулся с той же проблемой, а затем понял, что мои экспортированные из Windows Photoshop файлы .png были файлами .PNG. Видимо, заглавная буква имеет значение.

Также см. Привет-Res @ 2x изображение не выбирается для элемента панели вкладок

2 голосов
/ 11 мая 2011

Я могу подтвердить, что это проблема с устройством 4.0.Проблема не в том, что он не загружает изображение @ 2x, это действительно так, но он все равно отображает его с разрешением 72 DPI (что делает его размытым).

Эта ошибка, к счастью, исправлена ​​в 4.1 (протестированоэмулятор).

1 голос
/ 14 августа 2010

Кто-то в другой ветке упомянул, что ему удалось решить такую ​​же неприятную проблему, удалив и повторно добавив изображения высокого разрешения в проект.

0 голосов
/ 09 января 2013

У меня была похожая проблема, когда я заменил icon-close.png с низким разрешением на icon-close@2x.png с высоким разрешением. Сборки iPad, казалось, игнорировали «@ 2x» и загружали изображение в двойном размере со шкалой = 1,0. Удаление файла и добавление обратно не помогло. Переименование его в "icon-leave@2x.png" сделало. Некоторая плохая информация где-то кешируется о icon-close.png

0 голосов
/ 15 марта 2012

У меня просто была похожая проблема, для выяснения которой потребовалось некоторое время. Оказывается, мои @ 2x-изображения как-то не были добавлены в цель моего приложения, поэтому они не были упакованы.

0 голосов
/ 26 января 2012

У меня была похожая проблема из-за имени файла - button_slice9.png и button_slice9@2x.png не работали.

Но button_slice.png и button_slice@2x.png работают как положено в imageNamed:.

...