UIImage imageNamed возвращает ноль
Я довольно новичок в iOS и Xcode.
Я пытался загрузить изображение с
[UIImage imageNamed:@"imageName.png/jpg and so on"];
но это только возвращает ноль. Изображение должно быть в моем комплекте проекта, учитывая тот факт, что я могу выбрать его из меню перетаскивания в InterfaceBuilder, и оно было добавлено в Xcode через меню "Добавить файлы в" имя проекта "...".
Не имеет значения, использую ли я изображения в формате.png или.jpg, результат остается тем же: они работают через IB, но не в том случае, если я сам пытаюсь запустить метод imageNamed.
17 ответов
Есть только несколько причин, по которым изображение вернулось бы с помощью imageNamed:
Изображение не в вашей пачке. Убедитесь, что изображение на самом деле в вашем проекте. Убедитесь, что цель проверена, нажав на файл и выбрав цель, к которой он принадлежит.
У вас неправильно написано имя изображения или проблема с расширением.
Вы используете дисплей сетчатки, но у вас нет изображения @2x. Попробуйте сменить симулятор на сетчатку и посмотрите, появится ли он.
Несколько советов:
Если вы тестируете с помощью симулятора, удалите приложение из симулятора и очистите проект, а затем снова запустите. Если он все еще появляется, он должен появиться на вашем телефоне (если это не так, вероятно, это проблема с именем файла или версией @2x).
Если вы проводите тестирование на своем телефоне, и он не отображается, убедитесь, что вы используете ту же версию симулятора (если у вас iPhone 4/4, обязательно используйте симулятор 4/4 с сетчаткой).
Последнее, что следует из этого поста: JPG-изображение не загружается с UIImage imageNamed. Существует некоторая проблема с некоторыми типами JPG, работающими с imageNamed и без расширения. IMO, вы все равно должны использовать PNG, поскольку iOS сжимает их для вас, если только вам не нужно использовать JPG.
Если вы проверили все вышеперечисленное и обнаружили, что ваш UIImage(с именем: "myImage") возвращает ноль из кода внутри динамической структуры, которую вы строите, то вам нужно изменить код на:
UIImage(named: "myImage", in: Bundle(identifier: "com.myframework.name"), compatibleWith: nil)
Это должно правильно извлечь ресурс из CXAssets.
В моем случае PNG был уродливым.
По какой-то причине предварительный просмотр Xcode показал это правильно, но когда я попытался загрузить его с помощью UIImage, он вернул ноль.
У меня только что была эта проблема для файлов jpg, названных на диске "file.jpg"
Я пытался загрузить без расширения, просто @"файл". Хотя это отлично работает для PNG, это не для JPG. Как только я использовал @"file.jpg", все заработало!
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)
Я думаю, что первый более полезен, потому что он более читабелен, чем второй.
Попробуйте повторно экспортировать ваше изображение.
У меня была похожая проблема, UIImage imageNamed возвращал ноль, и ни один из этих ответов не решил мою проблему.
Я обнаружил, что на самом деле что-то не так с файлом PNG. Я открыл файл в редакторе изображений GIMP, сохранил его как новый файл, снова экспортировал как png, и он волшебным образом начал работать.
Я вообще ничего не изменил в коде, поэтому определенно что-то не так с настоящим файлом изображения.
Пытаться
[UIImage imageNamed:@"imageName.png"];
вместо этого (с расширением)
Убедитесь, что в конце файла нет места. Название как name @2x.png
не удастся загрузить, но name@2x.png
Это хорошо
Попробуй использовать UIImage(contentsOfFile:)
вместо imageNamed
, Это работало для меня с загруженными изображениями.
У меня была похожая проблема, наконец, очистка исправила ее: изображение появилось в симуляторе, но id не показывалось при запуске приложения на iPhone.
Что я сделал:
1) удалил приложение с iPhone
2) выполнил Product/Clean после этого ошибка была исправлена и изображение появилось!
У меня была такая же проблема: @"photo.jpg" привел к 'nil' UIImage. При переходе на "фактическую" спецификацию файлов @"photo.JPG" работает отлично! Я не понял, что там чувствительность к регистру! ОЧЕНЬ не интуитивно понятно.
В моем случае проблема заключалась в названии изображения в каталоге активов. Например, если у вас есть изображение с именем "TEst" и вы изменили имя на "Test", изменения не будут проиндексированы. Если ваш товарищ по команде выполнит фиксацию с этими изменениями, изображение в его каталоге ресурсов будет иметь предыдущее имя "TEst". Очень маленький шанс поймать эту ситуацию, но это возможно.
Убедитесь, что у вас есть изображение для УСТРОЙСТВА, которое вы используете в файле.xcassets. Изображение, помеченное для iPad, не будет отображаться на телефоне (или на имитированном телефоне).
В моем случае использование имени с акцентированными символами оказалось плохой идеей. Я изменил Astéroïdes на астероиды, и это работало нормально.
В дополнение к ответу @Inturbidus: Для тех, кто пришел сюда, работает над расширениями приложений:
Изображение, с которым вы работаете, должно принадлежать обеим целям - размещенному приложению и расширению.
В другом случае вы всегда будете получать nil
пытаясь получить к нему доступ из кода расширения.
Убедитесь, что поле имени инспектора атрибутов на изображении точно соответствует имени, которое вы используете. В моем случае изображение было частью папки, поэтому имя изображения было "папка / имя". Использование этого длинного имени решило проблему. XCode 7.3.1
Работает ли изображение на симуляторе, но не на устройстве?
Если так, то в этом сценарии это всегда связано с регистром имени. Устройство требует точного случая, и симулятор не такой суетливый, если я правильно помню.
например, для изображения с именем image.png
[UIImage imageNamed:@"Image"];
будет работать на симуляторе, но не на устройстве...
У меня было несколько.xcasset в моих проектах, и у 2 были повторяющиеся имена изображений. Так что в моем случае изображение не загружалось.
Для Xcode 6.4, нажмите на Images.xcassets и проверьте, есть ли записи для каждого изображения, которое вы вызвали. Вы можете щелкнуть правой кнопкой мыши по изображению и выбрать "Показать в Finder", чтобы проверить, правильно ли добавлены изображения.