2010-08-09 3 views
13

Я размещаю изображение play.png на своем представлении. Когда представление первоначально загружается, iPhone 4 захватывает соответствующий файл [email protected], и он выглядит великолепно. Однако, когда я нажимаю кнопку воспроизведения, мой код заменяет его на файл pause.png. Затем, когда я нажимаю pause.png, чтобы вернуть play.png, он использует исходный файл play.png (а не версию @ 2x, как я думал, он автоматически ссылается).Значки сетчатки (@ 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]; 
} 

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

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

+1

Пожалуйста, напишите, как вы меняете изображения ... 'UIImage imageNamed' обычно обрабатывает его автоматически, тогда как другие методы пока не установлены – iwasrobbed

+0

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

+0

сейчас я использую следующий (извините, я не могу понять, как форматировать код как код): если ([UIScreen В начало] .scale> 1,0) { \t [кнопка setImage: [UIImage imageNamed: @ "[email protected]"] forState: UIControlStateNormal]; } else { \t [кнопка setImage: [UIImage imageNamed: @ "play.png"] forState: UIControlStateNormal]; } Он работает нормально, но наличие утверждения IF в нем раздражает и кажется немного хрупким. – nicjohnson

ответ

2

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

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

25

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

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

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

+0

Вы можете заметить из моего первоначального сообщения, что строка кода, которую вы мне дали, является именно тем, что я использовал. Сначала она загрузила версию игрового образа сетчатки, но когда я постучал ее и поменял ее на pause.png, а затем обратно в play.png, он будет использовать версию play.png с низким разрешением. – nicjohnson

+1

К сожалению, код, который вы описываете, должен работать нормально, поэтому я думаю, что проблема находится где-то еще в вашем проекте. Я просто сделал кнопку с двумя изображениями, и каждый щелчок мыши переключается; работает отлично.Не могли бы вы разместить весь код с помощью этой кнопки? –

1

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

3

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

Также см Hi-Res @2x image not being picked up for tab bar item

4

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

  1. Accidentally именования небольшие версии @ 2x вместо больших них
  2. Имея большие версии будут слегка missized (на один пиксель)
7

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

[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, создает новые устройства или дисплеи ,

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

См: Supporting High-Resolution Screens, раздел «Загрузка изображений в приложение»

+0

Хорошее предвидение! то есть. iPhone 6 Plus и @ 3x :) –

0

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

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

0

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

0

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