我一直在争取几天试图获得最有效/最有效的解决方案,将一系列图像加载到.animationImages属性,并能够动态更改该阵列。这是场景: - 我有一个UIImageView - 根据用户输入(手机移动,陀螺仪),我将加载一个特定的图像阵列来设置动画。 - 在用户输入(触摸)上播放加载的动画。
现在,使用initWithData,使用从gyroHandler上运行的块调用的“NSThread detachNewThreadSelector”(仅在某些情况下),将图像数组加载到另一个线程上。其他启动方法完全失败。
现在的问题是,当我第一次触摸时(因为当前动画已被加载)并触发动画,整个事物会冻结为aprox。一秒然后播放动画。如果我再次触摸它会成功播放动画,没有延迟/冻结。
现在我在某处阅读动画片在后台...我尝试使用:
[imgAnimationKey performSelectorInBackground:@selector(startAnimating) withObject:nil];
但结果是一样的。
我的阵列有19个图像,并且很可能总是会有相同的图像。 问题是我可能有更多5+动画可以播放,这就是为什么我没有多个UIImageViews。
有人知道预装图像的方法,避免第一次播放延迟吗?或者我可以让动画在不同的线程中运行并避免这种影响(我可能做错了)?
谢谢!
答案 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,然后在主线程上设置结果。