0

アプリで使用したい一連の画像があります。私がやりたかったのは、 drawRect: 関数内で簡単に識別できるように、それらを NSArray に格納することです。

.plist ファイルを作成しました。このファイルには、NSDictionary の詳細が示されています。キーは単純に昇順の整数値であり、値は画像ファイル名に対応しています。これにより、辞書を繰り返し処理し、一連の NSImage オブジェクトを配列に追加できます。ここで for ループを使用しているのは、順序が重要であり、高速な列挙では辞書から読み取るときに実行順序が保証されないためです。

現在、私は次のことを行っています:(これはNSViewのサブクラスにあります)

@property (strong) NSDictionary *imageNamesDict;
@property (strong) NSMutableArray *imageArray;
...

// in init method:

    _imageNamesDict = [[NSDictionary alloc] initWithContentsOfFile:@"imageNames.plist"];

    _imageArray = [[NSMutableArray alloc] initWithCapacity:[_imageNamesDict count]];

    for (int i=0; i<_imageNamesDict.count; i++) {
        NSString *key = [NSString stringWithFormat:@"%d", i];
        [_imageArray addObject:[NSImage imageNamed:[_imageNamesDict objectForKey:key]];
    }

// When I want to draw a particular image in drawRect:

    int imageToDraw = 1;

    // Get a pointer to the necessary image:
    NSImage *theImage = [_imageArray objectAtIndex:imageToDraw];

   // Draw the image
    NSRect theRect = NSMakeRect (100,100, 0, 0);
    [theImage drawInRect:theRect fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0];

これはすべて正常に動作しているように見えますが、1 つの癖があります。ディスプレイを描画するときに発生するわずかな遅延に気付きましたが、これは初めて新しい画像を描画するときだけです。各画像が少なくとも 1 回表示されると、ラグなしで任意の画像を再描画できます。

画像を適切に読み込んでいないということですか、または for ループに追加するオブジェクトを作成するときに各画像を事前にキャッシュする方法はありますか?

ありがとう!

4

1 に答える 1

2

コメントで指摘された「... NSMutableArray ではなく NSMutableDictionary ...」の問題を克服したと仮定すると、画像を適切にロードしています。

あなたが説明しているラグは、画像を描画するために必要なすべて[NSImage imageNamed: ]の作業を行っていないためです。これは、最初の描画で発生しています。

次のように、画像を配列に追加するときに画像をオフスクリーンバッファーに描画することで、おそらくラグを取り除くことができます。

// Create an offscreen buffer to draw in.
newImage = [[NSImage alloc] initWithSize:imageRect.size];
[newImage lockFocus];

for (int i=0; i<_imageNamesDict.count; i++) {
    NSString *key = [NSString stringWithFormat:@"%d", i];
    NSImage *theImage = [NSImage imageNamed:[_imageNamesDict objectForKey:key]];
    [_imageArray addObject: theImage];
    [theImage drawInRect:imageRect fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0];
}
[newImage unlockFocus];
[newImage release];
于 2012-12-17T23:07:53.023 に答える