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.

Re комментарий Майка Веллера. Флажок есть....

Если вы проверили все вышеперечисленное и обнаружили, что ваш 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", чтобы проверить, правильно ли добавлены изображения.

Другие вопросы по тегам