私はiOSとXcodeにかなり慣れています。
私は画像をロードしようとしました
[UIImage imageNamed:@"imageName.png/jpg and so on"];
ただし、nilのみを返します。 InterfaceBuilderのドラッグアンドドロップメニューから選択でき、「ファイルを「プロジェクト名」に追加...」メニューを介してXcodeに追加されたという事実を考慮して、画像はプロジェクトバンドルに含まれている必要があります。
.pngまたは.jpgの画像を使用しても違いはありません。結果は同じままです。IBを介して機能しますが、imageNamedメソッドを自分で実行しようとしても機能しません。
ImageNamedで画像がnilに戻る理由はいくつかあります。
画像がバンドルに含まれていません。画像が実際にプロジェクトにあることを確認してください。ファイルをクリックし、ターゲットが属するターゲットを選択して、ターゲットがチェックされていることを確認してください。
イメージ名のスペルが間違っているか、拡張子に問題があります。
Retinaディスプレイを使用していますが、@ 2x画像がありません。シミュレータを網膜に変更して、表示されるかどうかを確認してください。
資産カタログを使用している場合は、属性インスペクターで正しいデバイスが選択されていることを確認してください。
いくつかのヒント:
シミュレーターを使用してテストしている場合は、シミュレーターからアプリを削除してプロジェクトをクリーンアップしてから、再実行してください。それでも表示される場合は、電話に表示されます(表示されない場合は、ファイル名または@ 2xバージョンの場合の問題です)。
スマートフォンでテストしていて表示されない場合は、同じバージョンのシミュレーターを使用していることを確認してください(iPhone 4/4をお持ちの場合は、必ず4/4シミュレーターをRetinaで使用してください)。
この投稿によると、最後の1つは次のとおりです。 JPGイメージはUIImage imageNamedではロードされません imageNamedで動作し、拡張子なしの特定のJPGタイプには問題があります。 IMOは、JPGを使用する必要がある場合を除き、iOSが圧縮するため、とにかくPNGを使用する必要があります。
マイク・ウェラーのコメントについて。チェックボックスは...です。
私の場合、PNGは不正な形式でした。
何らかの理由でXcodeプレビューで正しく表示されましたが、UIImageでロードしようとすると、nilが返されました。
ディスク「file.jpg」にあるjpgファイルに対してこの問題が発生しました。
拡張子なしで、単に「ファイル」をロードしようとしていました。これはpngでは正常に機能しますが、jpgでは機能しません。 @ "file.jpg"を使用すると、うまくいきました!
上記のすべてを確認し、UIImage(named: "myImage")がnil 構築中の動的フレームワーク内のコードからを返すことを発見した場合、コードを次のように変更する必要があります。
UIImage(named: "myImage", in: Bundle(identifier: "com.myframework.name"), compatibleWith: nil)
これにより、CXAssetsからアセットが正しく取得されます。
ファイルの最後にスペースがないことを確認してください。 name @2x.png
などの名前はロードに失敗しますが、[email protected]
は問題ありません
画像を再エクスポートしてください。
私は同様の問題を抱えていました。UIImageimageNamedはnilを返していましたが、これらの答えはどれも私の問題を解決しませんでした。
実際には、PNGファイルに問題があることがわかりました。 GIMPイメージエディターでファイルを開き、新しいファイルとして保存し、pngとして再びエクスポートして、魔法のように機能し始めました。
コードには何も変更しなかったため、実際の画像ファイルには間違いがありました。
imageNamed
の代わりにUIImage(contentsOfFile:)
を使用してみてください。ダウンロードした画像でうまくいきました。
私は同じ問題を抱えていました:@ "photo.jpg"は 'nil' UIImageをもたらしました。 「実際の」ファイル仕様に変更すると、@「photo.JPG」は正常に機能します。大文字と小文字が区別されることに気付いていませんでした!非常に直感的ではありません。
私は同様の問題があり、最終的にクリーンアップで修正しました:画像はシミュレータに表示されましたが、iPhoneでアプリを実行するとidが表示されませんでした。
私がしたこと:1)iPhoneからアプリを削除しました2)バグが修正され、画像が表示された後にProduct/Cleanを実行しました!
Swift 5
動的フレームワークでUIImage nilを取得する場合、バンドル識別子で画像を設定する必要があります。
このようなバンドルの拡張機能を作成できます。
拡張機能を作成します。
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)
最初のものは2番目のものより読みやすいので便利だと思います。
楽しい
使用しているデバイスのイメージが.xcassetsファイルにあることを確認してください。 iPad用にフラグが付けられた画像は、電話(またはシミュレートされた電話)には表示されません。
画像の属性インスペクター名フィールドが、使用している名前と正確に一致していることを確認してください。私の場合、画像はフォルダの一部であったため、画像名は「folder/name」でした。この長い名前を使用して問題を解決しました。 XCode 7.3.1
試してみる
[UIImage imageNamed:@"imageName.png"];
代わりに(拡張子付き)
Xcode 6.4の場合、Images.xcassetsをクリックして、呼び出した各画像のエントリがあるかどうかを確認します。画像を右クリックして[Finderに表示]を選択し、追加された画像が正しいかどうかを確認できます。
私の場合、アクセント記号付きの文字を含む名前を使用するのは適切ではありません。 AstéroïdesをAsteroidsに変更しましたが、問題なく動作しました。
@Inturbidusの答えに加えて、ここに来てApplication Extensions:
作業している画像は、両方ターゲット-ホスト型アプリと拡張機能に属している必要があります。
それ以外の場合は、拡張機能のコード内から常にnil
にアクセスしようとします。
画像はシミュレーターで機能しますが、デバイスでは機能しませんか?
その場合、このシナリオでは、名前の大文字と小文字を区別するのはalwaysです。デバイスには正確なケースが必要で、正しく覚えていればシミュレーターはそれほどうるさくありません。
例えばimage.pngという名前の画像の場合
[UIImage imageNamed:@"Image"];
シミュレータでは動作しますが、デバイスでは動作しません...