強火で進め

このブログではプログラム関連の記事を中心に書いてます。

iOSでBundleファイルを使う方法

以前参加した「conferenceWithDevelopers」で @akisutesama のセッションで画像ファイルをBundleファイルで持つという話が有りました。

「conferenceWithDevelopers」に参加して来ました - 強火で進め
http://d.hatena.ne.jp/nakamura001/20130223/1361628235

その時のスライド資料はこちら。このスライドのP.37が該当の場所。
http://www.slideshare.net/masashiono1/sdk-16733662

自分はBundleファイルを使った事が無かったので使い方を調べてみました。


まずは公式のドキュメント。
公式のドキュメントだと Info.plist を含める必要が有り、結構手間かなぁ?と思いました。

Bundle Programming Guide: Introduction
https://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFBundles/Introduction/Introduction.html

しかし、Stack Overflowに有る質問の回答によるとフォルダのファイル名の最後に拡張子 .bundle を使うだけでも使用可能みたいです。

How to make an iOS asset bundle? - Stack Overflow
http://stackoverflow.com/questions/4888208/how-to-make-an-ios-asset-bundle

という事で作り方が分かったので早速、実践。

Single View Application のテンプレートを元にサンプルプロジェクトを作成。
test.png (赤い画像)という画像ファイルを普通にプロジェクトに追加。次に .bundle フォルダに格納した test.png (青い画像)を追加しました。

それでもって ViewController にこんなプログラムを作ってテストしてみました。プロジェクト全体を確認したい場合はこちら

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    
    
    // Bundleの方から読み込む。青い画像の方の test.png が読み込まれる
    NSString* imagePath = [NSString stringWithFormat:@"%@/test.png",
                          [[NSBundle mainBundle] pathForResource:@"test" ofType:@"bundle"]];
    NSLog(@"%@", imagePath);
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:imagePath];
//    UIImage *image = [UIImage imageNamed:@"test.png"]; // よく有る読み込み方。赤い画像の方の test.png が読み込まれる

    UIImageView *imageView = [[UIImageView alloc] init];
    [imageView setFrame:CGRectMake(50.0, 50.0, (float)image.size.width, (float)image.size.height)];
    [imageView setImage:image];
    [self.view addSubview:imageView];
}

プログラムでコメントアウトしている方に切り替えるとちゃんと赤い画像の方の test.png が表示されちゃんと使い分けが出来る事を確認しました。

因みに昔は同名のファイルが有るとビルド時にエラーに成ってた気がするのですが現在はエラーに成らないみたいですね。ビルド後のアプリの中を確認してみると2つのファイルそれぞれが格納されてたフォルダが作られており、その下にそれぞれのファイルが有りました。