0

我有的

对于我的游戏,我正在使用 view.animationImages = imagesArray; 创建几个动画。[查看开始动画];

在我的动画助手类中,我使用它

- (UIImage *)loadRetinaImageIfAvailable:(NSString *)path
{
    NSString *retinaPath = [[path stringByDeletingLastPathComponent] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@@2x.%@", [[path lastPathComponent] stringByDeletingPathExtension], [path pathExtension]]];

    if ([UIScreen mainScreen].scale == 2.0 && [[NSFileManager defaultManager] fileExistsAtPath:retinaPath] == YES)
        return [[UIImage alloc] initWithCGImage:[[UIImage imageWithData:[NSData dataWithContentsOfFile:retinaPath]] CGImage] scale:2.0 orientation:UIImageOrientationUp];
    else
        return [UIImage imageWithContentsOfFile:path];
}

- (NSMutableArray *)generateCachedImageArrayWithFilename:(NSString *)filename extension:(NSString *)extension andImageCount:(int)count
{
    _imagesArray = [[NSMutableArray alloc] init];
    _fileExtension = extension;
    _imageName = filename;
    _imageCount = count;

    for (int i = 0; i < count; i++)
    {
        NSString *tempImageNames = [NSString stringWithFormat:@"%@%i", filename, i];
        NSString *imagePath = [[NSBundle mainBundle] pathForResource:tempImageNames ofType:extension];

        UIImage *frameImage = [self loadRetinaImageIfAvailable:imagePath];
        UIGraphicsBeginImageContext(frameImage.size);
        CGRect rect = CGRectMake(0, 0, frameImage.size.width, frameImage.size.height);
        [frameImage drawInRect:rect];
        UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        [_imagesArray addObject:renderedImage];

        if (_isDoublingFrames)
        {
            [_imagesArray addObject:renderedImage];
        }
        else if (_isTriplingFrames)
        {
            [_imagesArray addObject:renderedImage];
            [_imagesArray addObject:renderedImage];
        }

        NSLog(@"filename = %@", filename);
    }

    return _imagesArray;
}

问题和事实

  • 如果没有缓存图像,我会得到视网膜版本的图像,因为我的动画不流畅
  • 如果我以这种方式缓存图像,动画还可以,但使用非视网膜版本的图像

请问还有其他方法可以缓存和获取视网膜版本吗?

4

1 回答 1

1

这些图像是否位于您的应用程序包中?如果是这样,这个逻辑就完全没有必要了,因为 imageWithContentsOfFile: 方法已经检测到 @2x 图像并将其加载到视网膜设备上。

此外,您最好使用 [UIImage imageNamed:] 方法,因为这会自动缓存图像以供重复使用,并立即解压缩,从而避免手动缓存图像或将其绘制到的那种诡计一个屏幕外的 CGContext。

于 2013-05-13T13:58:58.670 回答