2011-01-21 16 views
5

ウェブApple.pngと[email protected]から2枚の画像をダウンロードしています。私は[UIImage imageNamed:@ "Apple.png"]を使用して、Apple.pngか[email protected]を表示するかどうかを検出するために機能のビルドを使用できるようにします。(iPhone)UIImageの画像で外部画像を表示する名前付き

ここで、これらの画像はどこに保存されますか?私はドキュメントで次のように読む:

ファイルの名前。初めて イメージがロードされる場合、 メソッドは、アプリケーションの メインバンドルに 指定された名前のイメージを探します。

ああ、アプリケーションのメインバンドルは、移動する方法です。ファイルがパスのフォルダに作成し、それが正しいとした場合、私がチェック

NSString  *directory = [[NSBundle mainBundle] bundlePath]; 
NSString  *path  = [directory stringByAppendingPathComponent:imageName]; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 

[fileManager createFileAtPath:path contents:dataFetcher.receivedData attributes:nil]; 

:これは私のコードは次のようになります。また、同じフォルダに格納されているかどうかを確認するために、プロジェクトファイルにExample.pngをドラッグしても問題はありません。

ただし、[UIImage imageNamed:@ "Apple.png"]はまだ画像を取得できません。誰にもアイデアはありますか?


編集:

@implementation UIImage(ImageNamedExtension)

+ (UIImage *)imageNamed:(NSString *)name fromDirectory:(NSString *)directory { 

    NSString  *name2x  = [name stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@".%@", [name pathExtension]] withString:[NSString stringWithFormat:@"@2x.%@", [name pathExtension]]]; 
    NSString  *path  = [directory stringByAppendingPathComponent:name]; 
    NSString  *path2x  = [directory stringByAppendingPathComponent:name2x]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2.0) { 

     if ([fileManager fileExistsAtPath:path2x]) { 
      return [UIImage imageWithContentsOfFile:path2x]; 

     } 

    } 

    return ([fileManager fileExistsAtPath:path]) ? [UIImage imageWithContentsOfFile:path] : nil; 
} 

@end 

eventualyトリックをした:

私はUIImageのカテゴリを作りました。助けてくれてありがとう。

+0

+1のコードフォーマットです。 – WrightsCS

+0

iPhoneのメインバンドルにファイルを作成することはできません。シミュレータはあなたにそれをさせるかもしれませんが、デバイスはそうしてはいけません。ダウンロードしている場合は、別の場所に置く必要があります。 –

+0

@ 2xのみが実装されている場合(つまり、1xも必要な場合など)、カテゴリはiPad(1st gen)の場合に壊れます。おそらく同じ状況下でiPhone 3GS上で破損する可能性があります。 – Jonny

答えて

0

ファイルにアクセスするための適切な権限でファイルを作成していますか?ファイルを保存した後にファイルを閉じるのを確認しましたか?

2

UIImage 'a +imageNamed:の方法では、アプリでダウンロードした画像を使用できません。そのメソッドは実際にはアプリケーションバンドル内の画像を探しますが、実行時に独自のバンドルを変更することはできません。

+0

奇妙なことに、私はエラーを出さず、FileManagerはそれがいいと言います。しかし、UIImage imageNamedがmainBundleで動作しない場合。正しいイメージを得るための選択肢はありますか? – Mark

+0

エラーかどうか、アプリのバンドルに書き込むことは間違いありません。 http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/RuntimeEnvironment/RuntimeEnvironment.html –

1

あなたのアプリ(つまり、あなたのサンドボックス)のローカルストアに画像を(もちろん非同期に)ダウンロードして、それらをローカルで参照してください。 NSDocumentDirectoryまたはNSCachesDirectoryを使用して、常にその場所の参照を取得できます。

+0

を参照してください。NSDocumentDirectoryにイメージを保存すると、イメージが正常に動作しません。現在、NSCachesDirectoryを試してみます。 – Mark

+0

ネガティブ。 NSCachesDirectoryも動作しません。 – Mark

+0

Johanの答えをご覧ください。つまり、 '+ imageNamed:'は素晴らしい解決策ですが、 '[[UIScreen mainScreen] scale] == 2.0'を使うのは難しくありません。 –

0

私は、ライブラリフォルダ内に独自のバンドルを作成することをお勧めします。 images.bundle。ここで両方の解像度の画像をストロークすることができます。そのイメージにアクセスするには、NSBundleクラスのpathForResource:ofType:メソッドを使用します。適切なイメージを返します。返されたパスを持つinitイメージより。

NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSError *error = nil; 
NSURL *libraryURL = [fileManager URLForDirectory:NSLibraryDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error]; 
if (libraryURL == nil) { 
    ALog(@"Could not access Library directory\n%@", [error localizedDescription]); 
} else { 
    NSURL *folderURL = [libraryURL URLByAppendingPathComponent:@"images.bundle"]; 
    DLog(@"Future bundle url = %@",folderURL); 
    if (![fileManager createDirectoryAtURL:folderURL withIntermediateDirectories:YES attributes:nil error:&error]) { 
     ALog(@"Could not create directory %@\n%@", [folderURL path], [error localizedDescription]); 
    } else{ 
     NSBundle *bundle = [NSBundle bundleWithURL:folderURL]; 
     // put image and [email protected] to the bundle; 
     [bundle pathForResource:yourImageName ofType:@"png"]; 
    } 
} 
関連する問題