UIImage imageNamed возвращает ноль
Я новичок в iOS и Xcode.
Я попытался загрузить изображение с помощью
[UIImage imageNamed:@"imageName.png/jpg and so on"];
но он возвращает только нуль. Изображение должно быть в моем пакете проектов, учитывая тот факт, что я могу выбрать его из меню перетаскивания в интерфейсе InterfaceBuilder, и он был добавлен в Xcode через меню "Добавить файлы в" имя проекта "...".
Не имеет значения, пользуюсь ли я изображениями .png или .jpg, результат остается тем же: они работают через IB, но не если я пытаюсь запустить метод imageNamed самостоятельно.
Ответы
Ответ 1
Есть только несколько причин, по которым изображение вернулось бы с помощью imageNamed:
-
Изображение не в вашей пачке. Убедитесь, что изображение на самом деле в вашем проекте. Убедитесь, что цель проверена, нажав на файл и выбрав цель, к которой он принадлежит.
-
У вас неправильно написано имя изображения или проблема с расширением.
-
Вы используете дисплей сетчатки, но у вас нет изображения @2x. Попробуйте сменить симулятор на сетчатку и посмотрите, появится ли он.
-
Если вы используете каталог ресурсов, убедитесь, что в инспекторе атрибутов выбраны правильные устройства.
Несколько советов:
Если вы тестируете с помощью симулятора, удалите приложение из симулятора и очистите проект, а затем снова запустите. Если он все еще отображается, он должен появиться на вашем телефоне (если это не так, вероятно, проблема с именем файла или версией @2x).
Если вы проводите тестирование на своем телефоне, и он не отображается, убедитесь, что вы используете ту же версию симулятора (если у вас iPhone 4/4, обязательно используйте симулятор 4/4 с сетчаткой).
И последнее, что следует из этого поста: изображение JPG не загружается с UIImage imageNamed. Существует некоторая проблема с некоторыми типами JPG, работающими с imageNamed и без расширения. IMO, вы все равно должны использовать PNG, поскольку iOS сжимает их для вас, если только вам не нужно использовать JPG.
Ответ 2
Re Майк Уэллер комментирует. Флажок установлен....
![enter image description here]()
Ответ 3
В моем случае PNG был искажен.
По какой-то причине предварительный просмотр Xcode показал его правильно, но когда я попытался загрузить его с UIImage, он вернул нуль.
Ответ 4
У меня была эта проблема для jpg файлов, названных на диске "file.jpg"
Я пытался загрузить без расширения, просто @ "file". Хотя это отлично работает для png, это не для jpg. Когда я использовал @ "file.jpg", он сработает!
Ответ 5
Если вы подтвердили все вышеизложенное и обнаружили, что ваш UIImage (named: "myImage" ) возвращает nil из кода внутри динамической структуры, которую вы строите, тогда вам нужно изменить код в:
UIImage(named: "myImage", in: Bundle(identifier: "com.myframework.name"), compatibleWith: nil)
Это должно правильно извлекать актив из CXAssets.
Ответ 6
Попробуйте повторно экспортировать изображение.
У меня была аналогичная проблема, UIImage imageNamed возвращал нуль, и ни один из этих ответов не устранил мою проблему.
Я узнал, что это действительно что-то не так с файлом png. Я открыл файл в редакторе изображений GIMP, сохранил его как новый файл, экспортировал его снова как png и по волшебству начал работать.
Я вообще ничего не менял в коде, поэтому в фактическом файле изображения было что-то не так.
Ответ 7
У меня была та же проблема: @ "photo.jpg" приводила к 'nil' UIImage.
Переходя к "фактическому" файлу, @ "photo.JPG" отлично работает!
Я не понял, что там была чувствительность к регистру! ОЧЕНЬ неинтуитивный.
Ответ 8
У меня была аналогичная проблема, и, наконец, очистка зафиксировала ее: изображение появилось в симуляторе, но идентификатор не появился при запуске приложения на iPhone.
Что я сделал:
1) удалило приложение с iPhone
2) выполненный продукт/чистый
после этого ошибка была исправлена, и изображение появилось!
Ответ 9
Попробуйте использовать UIImage(contentsOfFile:)
вместо imageNamed
. Он работал у меня с загруженными изображениями.
Ответ 10
Убедитесь, что в конце файла нет места.
Имя типа name @2x.png
не будет загружено, но [email protected]
в порядке
Ответ 11
попробуйте
[UIImage imageNamed:@"imageName.png"];
вместо (с расширением)
Ответ 12
Работает ли изображение на симуляторе, но не на устройстве?
Если это так, в этом случае всегда работает с именем. Устройство требует точного случая, и симулятор не настолько суетлив, если я правильно помню.
например. для изображения с именем image.png
[UIImage imageNamed:@"Image"];
будет работать на симуляторе, но не на устройстве...
Ответ 13
Убедитесь, что у вас есть изображение для УСТРОЙСТВА, которое вы используете в файле .xcassets. Изображение, помеченное для iPad, не будет отображаться на телефоне (или имитированном телефоне).
Ответ 14
В дополнение к @Inturbidus ответ:
Для тех, кто пришел сюда, работая над Расширениями приложений:
Образ, с которым вы работаете, должен принадлежать обеим целям - размещенному приложению и расширению.
В другом случае вы всегда будете получать nil
, пытаясь получить к нему доступ из внутреннего кода.
Ответ 15
Для Xcode 6.4 нажмите на Images.xcassets и проверьте, есть ли записи для каждого вызванного вами изображения. Вы можете щелкнуть правой кнопкой мыши по изображению и выбрать "Показать в Finder", чтобы проверить, правильно ли добавлены изображения.
Ответ 16
Убедитесь, что поле имени инспектора атрибутов изображения совпадает с именем, которое вы используете. В моем случае изображение было частью папки, поэтому имя изображения было "папкой/именем". Использование этого длинного имени решило проблему. XCode 7.3.1
Ответ 17
В моем случае использование имени с акцентированными символами оказалось плохой идеей. Я сменил Astéroïdes на Asteroids, и он отлично работал.
Ответ 18
Swift 5
Если вы получаете UIImage nil в динамическом фреймворке, вы должны установить изображение с идентификатором пакета.
Вы можете создать расширение для Bundle следующим образом:
Создать расширение;
extension Bundle {
public static let myFramework = Bundle(identifier: "com.myFramework.bundle")
}
Тогда используйте вот так;
UIImage(named: "myImageName", in: Bundle.myFramework, compatibleWith: nil)
Или
Вы можете использовать как это;
UIImage(named: "myImageName", in: Bundle(for: type(of: self)), compatibleWith: nil)
Я думаю, что первый полезен, потому что он более читабелен, чем второй.
наслаждаться