2

NSDrawNinePartImage()伸縮可能なコントロールを描画するために使用しています。もちろん、これにはパーツを描画するために 9 つの個別の画像が必要なので (さらに、その上に描画される追加の画像もいくつか必要です)、 および のようなファイルでいっぱいのディレクトリがありtop-left.pngますtop-left@2x.png。このディレクトリをフォルダー リファレンスとしてアプリ バンドルに含めます。

残念ながら、通常の画像読み込み APIは、名前にスラッシュを入れても、サブディレクトリをサポートしていないようです-[NSImage imageNamed:]-[NSBundle imageForResource:]代わりに、次の方法で画像をロードしています。

- (NSImage*)popoverImage:(NSString*)name {
    NSURL * url = [[NSBundle bundleForClass:self.class] URLForResource:name withExtension:@"png" subdirectory:@"popover"];
    return [[NSImage alloc] initWithContentsOfURL:url];
}

これは通常のディスプレイでは問題なく機能しますが、Retina ディスプレイの 2x 画像は無視されます。網膜画像もロードするにはどうすればよいですか? 2 つの担当者を別々にロードして手動で組み合わせるよりも良い方法はありますか? これらのリソースのソース ファイルとして TIFF を使用したくありません。なぜなら、私は Acorn をイメージ エディターとして使用しており、最後にチェックしたとき、Acorn はそのような複合イメージ フォーマットをあまりよく理解していなかったからです。

4

3 に答える 3

0

私は最終的に実行時に手動で画像を結合することにしました。このメソッドを NSImage のカテゴリに追加し、代わりに使用することでこれを行いました-initWithContentsOfURL:

- (id)initRetinaImageWithContentsOfURL:(NSURL *)url {
    if((self = [self initWithContentsOfURL:url])) {
        NSURL * baseURL = url.URLByDeletingLastPathComponent;
        NSString * baseName = url.lastPathComponent.stringByDeletingPathExtension;
        NSString * extension = url.lastPathComponent.pathExtension;

        NSString * retinaBaseName = [NSString stringWithFormat:@"%@@2x", baseName];
        NSURL * retinaURL = [baseURL URLByAppendingPathComponent:[retinaBaseName stringByAppendingPathExtension:extension]];

        if([retinaURL checkResourceIsReachableAndReturnError:NULL]) {
            NSData * data = [[NSData alloc] initWithContentsOfURL:retinaURL];
            NSBitmapImageRep * rep = [[NSBitmapImageRep alloc] initWithData:data];

            rep.size = self.size;
            [self addRepresentation:rep];
        }
    }

    return self;
}
于 2013-05-12T02:16:48.810 に答える