0

我有一系列想在应用程序中使用的图像。我想要做的是将它们存储在 NSArray 中,以便在 drawRect: 函数中轻松识别。

我创建了一个 .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];

这一切似乎都可以正常工作,但有一个怪癖。我注意到在绘制显示时会出现少量延迟,但仅在第一次绘制新图像时才会出现。一旦每个图像至少被看到一次,我就可以重新绘制任何想要的图像,而不会出现任何延迟。

是我没有正确加载图像,还是有什么方法可以在我创建要添加到 for 循环的对象时预先缓存每个图像?

谢谢!

4

1 回答 1

2

假设您已经克服了评论中指出的“... NSMutableDictionary 而不是 NSMutableArray ...”问题,那么您正在正确加载图像。

您所描述的滞后是因为[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 回答