Подтвердить что ты не робот

UIImage imageNamed: автоматически не выбирает сетчатки @2x изображения

Скажем, у меня есть три изображения в каталоге или каталоге активов:

В iOS 4 и более поздних версиях конструктор UIImage может принимать имя изображения следующим образом:

[UIImage imageNamed:@"Default"];

Когда я на 3,5-дюймовом экране сетчатки (iphone), он автоматически выбирает изображение (2). Если на дисплее без сетчатки он выбирает (1). Это здорово.

Я назвал изображение 3, как указано для 4-дюймового изображения сетчатки (iPhone 5). Есть ли способ назвать изображение (3), так что, когда я бегу на 4-дюймовом экране сетчатки, он возвращается с тем же конструкторомом UIImage?

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

4b9b3361

Ответ 1

У меня также была такая же проблема, и оказалось, что такого поведения для iPhone 5/iPod Touch 5-го поколения нет.

Вам необходимо вручную определить, работает ли ваше приложение на таком устройстве и соответственно изменить имя файла.

Я использовал этот метод, чтобы проверить, работает ли мое приложение на iPhone 5/iPod Touch 5th Gen.:

#define IS_PHONEPOD5() ([UIScreen mainScreen].bounds.size.height == 568.0f && [UIScreen mainScreen].scale == 2.f && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)

Затем вы можете настроить имя изображения следующим образом:

if(IS_PHONEPOD5()) {
   myImageView.image = [UIImage imageNamed:@"MyImage-568h.png"];
} else {
   myImageView.image = [UIImage imageNamed:@"MyImage.png"];
}

Обновление
Я также нашел категорию UIImage в github (Ссылка), которая реализует то, что вы ищете. У него нет резервной копии для не существующих файлов, но вы можете легко реализовать ее самостоятельно.

Ответ 2

Существует не 4 типа изображения. Единственное, что отличается от всего остального, это включение [email protected], которое используется как образ запуска для iPhone 5 и сигнализирует ОС, что ваше приложение поддерживает более длинный экран и не должен быть почтовым ящиком.

Вам нужно иметь дело с кодом или с автозапуском с разными размерами экрана. Там нет специального, автоматического типа изображения. Это либо стандартный экранный тип изображения, либо тип изображения сетчатки, так же, как и с iOS 4.

Ответ 3

Новый API в iOS 8 позволяет загружать версии сетчатки именованного изображения, ранее вы должны сами определять имена файлов:

UIImage* retinaImage = [UIImage imageNamed:@"ImageName" 
    inBundle:nil compatibleWithTraitCollection:nil];

NSLog(@"screen scale: %2.2f retinaImage: %@",
    [UIScreen mainScreen].nativeScale, retinaImage);