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 动画预加载的主要内容,如果未能解决你的问题,请参考以下文章

iOS翻转UIImageView 180度(非动画)

使用叠加按钮为 UIImageView 设置动画

动画图片预加载

预加载动画,移动端常用的加载前的百分比动画

在 didEnterBackground 之后如何继续 UIImageView 动画?

UITableViewCell 内的 UIImageView 旋转动画