UIImageView动画预加载

时间:2012-07-25 05:17:50

标签: ios animation uiimageview delay preload

我一直在争取几天试图获得最有效/最有效的解决方案,将一系列图像加载到.animationImages属性,并能够动态更改该阵列。这是场景: - 我有一个UIImageView - 根据用户输入(手机移动,陀螺仪),我将加载一个特定的图像阵列来设置动画。 - 在用户输入(触摸)上播放加载的动画。

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

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

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

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

但结果是一样的。

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以为UIImage类创建一个类别,以便在将其提供给UIImageView的image属性之前在后台线程中预加载图像:

<强> H:

#import <Foundation/Foundation.h>

@interface UIImage (preloadedImage)

- (UIImage *) preloadedImage;

@end

<强>米:

#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

在后台线程上调用preloadedImage,然后在主线程上设置结果。