Значки 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 вместо больших
те,
- Наличие больших версий
слегка пропущен (на один пиксель).
Ответ 5
Я столкнулся с одной и той же проблемой, а затем понял, что мои Windows файлы .png, экспортированные в Photoshop, были .PNG файлами. По-видимому, капитализация имеет значение.
Также см. Изображение Hi-Res @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