0

私のアプリは、ユニバーサルでRetinaディスプレイ用に設計されているため、サイズが大きくなっています。ユーザーがRetina画像を最初にアプリに含めるのではなく、サーバーからダウンロードできるようにしたい。

以下のコードでこれを試しました。唯一の問題は、画像がDocumentsフォルダーに保存されており、アプリがそれらをRetina画像として認識しないことです。

UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.test.com/img2@2x.png"]]];
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *pngFilePath = [NSString stringWithFormat:@"%@/img2@2x.png",docDir];
NSData *data1 = [NSData dataWithData:UIImagePNGRepresentation(image)];
[data1 writeToFile:pngFilePath atomically:YES];

アプリが画像を使用できるようにするには、画像をどのように保存する必要がありますか?

4

3 に答える 3

1

UIイメージのソースがNSDocumentDirectoryフォルダーではなくバンドルであるため、機能していません。網膜および非網膜画像を使用するには、デバイスが網膜であるかどうかを検出し、NSDocumentDirectoryからプログラムで画像をロードする必要があります。

これを使用して網膜を検出できます。

于 2013-02-04T18:12:41.540 に答える
1

このimageWithData:メソッドは、常に1.0のスケール(非網膜)の画像を作成します。initWithCGImage:scale:orientation:バンドル外のカスタムの場所から網膜対応のUIImageを作成するには、次の方法を使用する必要があります。

UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.test.com/img2@2x.png"]]];
UIImage *retinaImage = [UIImage initWithCGImage:[image CGImage] scale:2.0 orientation:UIImageOrientationUp];

(そして、明らかに、イメージを同期的にダウンロードするべきではありません...)。

前回のプロジェクトでも同じこと(ドキュメントディレクトリから縮尺に依存する画像を読み込む)を行う必要があったため、UIImageカテゴリに小さな便利なメソッドを作成しました。

- (id)initWithContentsOfResolutionIndependentFile:(NSString *)path
{
    if([[UIScreen mainScreen] scale] == 2.0) {
        NSString *path2x = [[path stringByDeletingLastPathComponent]
                            stringByAppendingPathComponent:[NSString stringWithFormat:@"%@@2x.%@",
                                                            [[path lastPathComponent] stringByDeletingPathExtension],
                                                            [path pathExtension]]];

        if([[NSFileManager defaultManager] fileExistsAtPath:path2x]) {
            return [self initWithCGImage:[[UIImage imageWithData:[NSData dataWithContentsOfFile:path2x]] CGImage] scale:2.0 orientation:UIImageOrientationUp];
        }
    }

    return [self initWithContentsOfFile:path];
}

使用法:

UIImage *myImage = [[UIImage alloc] initWithContentsOfResolutionIndependentFile:@"/path/to/image.png"];

/path/to/image@2x.pngこれは、網膜上にあるときから画像をロードしようとし、それ以外の場合は使用し/path/to/image.pngます。

于 2013-02-04T19:11:18.760 に答える
0

[UIImage imageWithData: scale:]「@2x」命名規則を使用してスキップすることができます。

- (UIImage *)getRetinaSafeImage: (NSString *)fileName
{
    // alternatively you can use NSURL instead of path
    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSData *myImageData = [NSData dataWithContentsOfFile: [NSString stringWithFormat:@"%@/%@",docDir, fileName]];

    if([[UIScreen mainScreen] scale] == 2.0)
        return [UIImage imageWithData:myImageData scale:2.0];
    else return [UIImage imageWithData:myImageData];
}
于 2014-01-03T13:15:15.407 に答える