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

Я помещаю изображение play.png на свое представление. Когда представление первоначально загружается, iPhone 4 захватывает соответствующий файл [email protected], и он выглядит великолепно. Однако, когда я нажимаю кнопку воспроизведения, мой код заменяет его на файл 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:@"[email protected]"] forState:UIControlStateNormal]; 
} 
else 
{ 
    [button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal]; 
}

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

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

Ответы

Ответ 1

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

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

Ответ 2

Условный оператор не нужен. Достаточна следующая строка:

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

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

Ответ 3

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

[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

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

  • Случайно называя маленькую версии @2x вместо больших те,
  • Наличие больших версий слегка пропущен (на один пиксель).

Ответ 6

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

Ответ 7

У меня была аналогичная проблема из-за имени файла - button_slice9.png и [email protected] не сработала.

Но button_slice.png и [email protected] работает как ожидается в imageNamed:.

Ответ 8

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

Ответ 9

У меня была аналогичная проблема, когда я заменил low res icon-close.png с высоким разрешением [email protected] iPad-сборки, казалось, игнорировали "@2x" и загружали изображение с двойным размером с помощью scale = 1.0. Удаление файла и добавление обратно не помогло. Переименовать его на "[email protected]". Некоторая плохая информация, кэшированная где-то о icon-close.png