4503

[code]

        CGRect screen = [[UIScreen mainScreen]bounds];
        CGRect rect = CGRectMake(screen.size.width/2, screen.size.height/2, 128, 128);
        imageView = [[UIImageView alloc]initWithFrame:rect];
        [self addSubview:imageView];
    
        imageView.animationImages = @[
                                       [UIImage imageNamed:@"fire_flower01.png"],
                                       [UIImage imageNamed:@"fire_flower02.png"],
                                       [UIImage imageNamed:@"fire_flower03.png"],
                                       [UIImage imageNamed:@"fire_flower04.png"],
                                       [UIImage imageNamed:@"fire_flower05.png"],
    
[/code]

上記のコードをシミュレーターで実行するとエラーも無く実行できるのですが、実機で実行すると
`animationImages`に画像を入れる過程で以下のエラーが表示されます。

`attempt to insert nil object from objects[0]`

なので`nil`を加えようと以下のように変更してみたのですが、今度は`unrecognized selector sent to
instance`というエラーが返ってきました。

[code]

    NSArray *animationImages = @[[[NSArray alloc]initWithObjects:nil,
                                        [UIImage imageNamed:@"fire_flower01.png"],
                                        [UIImage imageNamed:@"fire_flower02.png"],
                                        [UIImage imageNamed:@"fire_flower03.png"],
                                        [UIImage imageNamed:@"fire_flower04.png"],
                                        [UIImage imageNamed:@"fire_flower05.png"], nil
                                    ]];
    
[/code]

パラパラのアニメーションを行うために画像を格納していきたいのですが、どうすればよろしいでしょうか？


CC BY-SA 3.0
2015-01-13T06:54:25.830
4485
2015-01-13T10:52:06.277
2015-01-13T10:52:06.277
4978
5210
question
ios objective-c uiimage xcassets
iOS 実機だと `UIImage imageNamed` が nil を返しイメージを読み込まない


コメントで解決しましたが、 プロジェクト内のカタログにイメージファイルをを追加していなかったということでした。

ここに補足含めてまとめておきます。

イメージ取得の API では、リソースが見つからないと `nil` を返すものがあります。
イメージリソースが見つからない原因には、以下のどちらかが有力です。

  1. 単純に、イメージファイルがプロジェクトに追加されていないもしくは、ファイル名が不正
  2. 実行時に、`@2x`, `@3x` 等のバージョンのリソースが読み込まれようとしたが失敗

今回は後者でしょう。環境によって、本来どのタイプのリソースが必要になるかは、 [iOS Human Interface
Guidelines](https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/IconMatrix.html#//apple_ref/doc/uid/TP40006556-CH27-SW1)
で大まかに知ることができます。

  * `@1x` : iPhone 3GS まで
  * `@2x` : iPhone 4,4s,5,5s,6 等の Retina 機
  * `@3x` : 現状 iPhone 6 Plus のみ
  * iPad であれば、さらに、 `~ipad` がバージョンに付加される

といったところ。実際は、カタログ (.xcassets)にリソースを追加する、 または、 ベクタイメージを用意することでことで、
これらの選択を意識しなくても良くなっています。今回は、 Retina 環境の実機が `@2x` バージョンのファイルを読みに行き、 `nil`
を返したと推測されます。 Mac 上で使用していたエミュレータが Retina
ディスプレイのものではなかったため、ローカルテスト中にはエラーが出なかったのでしょう。

参考: [SO: Xcode 6 - xcassets for universal image
support](https://stackoverflow.com/questions/26020979/xcode-6-xcassets-for-
universal-image-support)


CC BY-SA 3.0
2015-01-13T10:44:48.260
4503
2015-01-13T10:44:48.260
2017-05-23T12:38:55.250
-1
4978
4485
answer