1

几天来,我一直在努力寻找最有效/最高效的解决方案,将一组图像加载到 .animationImages 属性中,并能够即时更改该数组。这是场景: - 我有一个 UIImageView - 根据用户输入(手机移动、陀螺仪),我将加载一组特定的图像以进行动画处理。- 在用户输入(触摸)时播放加载的动画。

现在,图像数组使用“NSThread detachNewThreadSelector”加载到不同的线程上,该线程使用 initWithData 从 gyroHandler 上运行的块调用(仅在某些情况下)。其他启动方法完全失败。

现在的问题是,当我第一次触摸(因为当前动画已经加载)并触发动画时,整个事情都会冻结。一秒钟,然后播放动画。如果我再次触摸,它会成功播放动画,没有延迟/冻结。

现在我在某处阅读以在后台制作动画......我尝试使用:

[imgAnimationKey performSelectorInBackground:@selector(startAnimating) withObject:nil];

但结果是一样的。

我的阵列有 19 个图像,很可能总是有相同的。问题是我可能有更多 5+ 可以播放的动画,这就是我没有多个 UIImageViews 的原因。

有人知道预加载图像并避免第一次播放延迟的方法吗?或者我可以让动画在不同的线程中运行并避免这种效果(我可能做错了)?

谢谢!

4

1 回答 1

0

You could make a category for the UIImage class for preloading your image in a background thread before you provide it to the image property of your UIImageView:

h:

#import <Foundation/Foundation.h>

@interface UIImage (preloadedImage)

- (UIImage *) preloadedImage;

@end

m:

#import "UIImage+preloadedImage.h"

@implementation UIImage (preloadedImage)

- (UIImage *) preloadedImage {
    CGImageRef image = self.CGImage;

    // make a bitmap context of a suitable size to draw to, forcing decode
    size_t width = CGImageGetWidth(image);
    size_t height = CGImageGetHeight(image);

    CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef imageContext =  CGBitmapContextCreate(NULL, width, height, 8, width * 4, colourSpace,
                                                       kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little);
    CGColorSpaceRelease(colourSpace);

    // draw the image to the context, release it
    CGContextDrawImage(imageContext, CGRectMake(0, 0, width, height), image);

    // now get an image ref from the context
    CGImageRef outputImage = CGBitmapContextCreateImage(imageContext);

    UIImage *cachedImage = [UIImage imageWithCGImage:outputImage];

    // clean up
    CGImageRelease(outputImage);
    CGContextRelease(imageContext);

    return cachedImage;
}

@end

make the call of the preloadedImage on a background thread then and set the result on the main thread.

于 2012-07-25T07:46:13.817 回答