Ресурсы изображений для iOS
Мне, вероятно, не хватает чего-то очевидного здесь, но я не смог решить следующую проблему:
У меня есть проект с ресурсами изображения как для обычных, так и для сетчатых экранов, например someimage.png и [email protected], которые хранятся в отдельном комплекте. Когда я создаю проект, Xcode автоматически упаковывает их в один многостраничный tiff (imageName.tiff
), я проверил его в finder - это фактически многостраничный tiff с обоими изображениями. Однако здесь возникает проблема: я изо всех сил пытаюсь загрузить соответствующий ресурс.
Что я делаю:
NSString * imageName = ... ;
NSLog(@"imageName: %@", imageName);
UIImage * someImage = [UIImage imageNamed: imageName];
Также я использую вспомогательный метод, который возвращает пакет с ресурсами:
+(NSBundle *) resourcesBundle
{
NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"MyResourcesBundle" withExtension:@"bundle"]];
return bundle;
}
Я пробовал следовать за imageName
:
imageName = [[AuxClass resourcesBundle] pathForResource:@"someimage" ofType:@"png"];
в этом случае у null
для imageName
.
imageName = [[AuxClass resourcesBundle] pathForResource:@"someimage" ofType:@"tiff"];
в этом случае возвращается возвращенный путь образа, но он работает только, если я использую imageWithContentsOfFile
вместо imageNamed
, и он не принимает соответствующий ресурс: он загружает ресурс для сетчатки, несмотря на тип экрана.
Если я омпит filetype (как и раньше, добавляя ресурсы @2x
, и он работал нормально, и это было первое, что я пробовал, и был уверен, что это сработает)
imageName = [NSString stringWithFormat: @"%@/%@",
@"MyResourcesBundle.bundle"",
@"someimage" ];
ничего не загружается.
Добавление расширения .tiff имеет тот же эффект, что и pathForResource:
- загружается ресурс для сетчатки, без учета ресурса для экрана без сетчатки.
Так что мне не хватает? Каков правильный способ загрузки изображений?
Ответы
Ответ 1
Вы пытались просто загрузить изображение, используя:
UIImage * someImage = [UIImage imageNamed: @"someimage"];
(если у вас есть изображение с именем "someimage" в проекте, например someimage.png)
Код будет автоматически выбирать версии сетчатки/не-сетчатки в зависимости от платформы.
Если проблема в том, что TIFF создан, проверьте:
![XCode Combine high-resolution artwork]()
В последней версии XCode перейдите в меню "Редактор", затем выберите "Validate settings", который должен удалить эту комбинацию.
Ответ 2
Многостраничные TIFF предназначены только для OSX; они не работают на iOS.
Поэтому вам нужно перестать пытаться получить доступ к ресурсам, которые по своей природе недоступны и делают все правильно!
Вам нужно открыть проект, который создает набор внешних ресурсов, выбрать цель, перейти в "Настройки сборки", а затем подзаголовок "Развертывание" и установить "Объединить изображения с высоким разрешением" на "Нет". Затем перекомпилируйте пакет внешних ресурсов.
В вашем основном проекте вы теперь сможете читать в PNG обычным способом.
Ответ 3
Если вы работаете с пакетами, а не переходите к
- > установить параметры → COMBINE_HIDPI_IMAGES в НЕТ,
и вам просто нужно очистить и построить!
Ответ 4
Когда вы создаете изображения для своего приложения, скажем, вы создаете образ под названием example
.
Вы должны сохранить следующее:
- example ~ iphone.png → это для не сетчатки iPhone
- [email protected] → это для сетчатки iPhone
- example ~ ipad.png → это для не сетчатки iPad
- [email protected] → это для сетчатки iPad
Итак, не имеет значения, откуда вы это называете, вы просто называете это так, предполагая, что myImageView является объектом UIImageView:
[myImageView setImage:[UIImage imageNamed:@"example"]];
Apple настоятельно рекомендует использовать png-изображения. Кроме того, ОС заботится о поиске правильного изображения для желаемого устройства. Вам не нужно беспокоиться о том, как найти путь и все такое. +(UIImage*)imageNamed:(NSString*)name
ищет правильное изображение в вашем ресурсном пакете - и, кстати, чтобы вернуть пакет с вашими ресурсами, просто позвоните [NSBundle mainBundle];
Ответ 5
- > установить параметры → COMBINE_HIDPI_IMAGES в NO
это единственное решение, которое работает, и никаких других изменений не требуется