UIImageView 动画预加载
Posted
技术标签:
【中文标题】UIImageView 动画预加载【英文标题】:UIImageView animation preload 【发布时间】:2012-07-25 05:17:50 【问题描述】:几天来,我一直在努力寻找最有效/最高效的解决方案,将图像数组加载到 .animationImages 属性并能够即时更改该数组。这是场景: - 我有一个 UIImageView - 根据用户输入(手机移动、陀螺仪),我将加载特定的图像数组以进行动画处理。 - 在用户输入(触摸)时播放加载的动画。
现在,图像数组使用“NSThread detachNewThreadSelector”加载到不同的线程上,该线程使用 initWithData 从 gyroHandler 上运行的块调用(仅在某些情况下)。其他启动方法完全失败。
现在的问题是,当我第一次触摸(因为当前动画已加载)并触发动画时,整个事情都会冻结。一秒钟,然后播放动画。如果我再次触摸,它会成功播放动画,没有延迟/冻结。
现在我在某处阅读以在后台制作动画...我尝试使用:
[imgAnimationKey performSelectorInBackground:@selector(startAnimating) withObject:nil];
但结果是一样的。
我的数组有 19 张图像,而且很可能总是相同。 问题是我可能有更多 5+ 可以播放的动画,这就是我没有多个 UIImageViews 的原因。
有人知道预加载图像并避免首次播放延迟的方法吗?或者我可以让动画在不同的线程中运行并避免这种效果(我可能做错了)?
谢谢!
【问题讨论】:
我降低了图像质量。它有所改善,但仍有一些延迟。 【参考方案1】:您可以为 UIImage 类创建一个类别,以便在将图像提供给 UIImageView 的图像属性之前在后台线程中预加载它:
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 然后在主线程上设置结果。
【讨论】:
感谢您的快速回复。我其实没试过。我们决定不包括这个。再次感谢。 如果是,请发布您的答案,以便任何人都可以从中受益:-)以上是关于UIImageView 动画预加载的主要内容,如果未能解决你的问题,请参考以下文章