目标C - 如何播放动画gif图像

时间:2017-05-05 08:53:04

标签: ios objective-c

我正在尝试展示动画gif,但它不起作用,它们会保持静止。

UIView * tak = [[UIView alloc] initWithFrame:CGRectMake(-10, 0, 560, 685)];
UIImage *image = [UIImage imageNamed:@"animated-f.gif"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = tak.bounds;
[tak addSubview:imageView];
[self.view addSubview:tak];

2 个答案:

答案 0 :(得分:0)

使用FLAnimatedImage

#import "FLAnimatedImage.h"

NSURL *url = [[NSBundle mainBundle] URLForResource:@"animated-f" withExtension:@"gif"];
    NSData *data = [NSData dataWithContentsOfURL:url];
FLAnimatedImage *image = [FLAnimatedImage animatedImageWithGIFData:data];
FLAnimatedImageView *imageView = [[FLAnimatedImageView alloc] init];
imageView.animatedImage = image;
imageView.frame = CGRectMake(0.0, 0.0, 100.0, 100.0);
[self.view addSubview:imageView];

答案 1 :(得分:0)

我发现SDWebImageUIImage+GIF中的这个方法可以在版本3.7.2之前播放gif,但是此方法占用大量内存,在版本sd中使用 FLAnimatedImage替换它,解决内存过多的问题。建议使用FLAnimatedImage

version 3.7.2 code

- (UIImage *)sd_animatedGIFWithData:(NSData *)data {
if (!data) {
    return nil;
}

CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);

size_t count = CGImageSourceGetCount(source);

UIImage *animatedImage;

if (count <= 1) {
    animatedImage = [[UIImage alloc] initWithData:data];
}
else {
    NSMutableArray *images = [NSMutableArray array];

    NSTimeInterval duration = 0.0f;

    for (size_t i = 0; i < count; i++) {
        CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);

        duration += [self sd_frameDurationAtIndex:i source:source];

        [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]];

        CGImageRelease(image);
    }

    if (!duration) {
        duration = (1.0f / 10.0f) * count;
    }

    animatedImage = [UIImage animatedImageWithImages:images duration:duration];
}

CFRelease(source);

return animatedImage;
}

- (float)sd_frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source {
float frameDuration = 0.1f;
CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil);
NSDictionary *frameProperties = (__bridge NSDictionary *)cfFrameProperties;
NSDictionary *gifProperties = frameProperties[(NSString *)kCGImagePropertyGIFDictionary];

NSNumber *delayTimeUnclampedProp = gifProperties[(NSString *)kCGImagePropertyGIFUnclampedDelayTime];
if (delayTimeUnclampedProp) {
    frameDuration = [delayTimeUnclampedProp floatValue];
}
else {

    NSNumber *delayTimeProp = gifProperties[(NSString *)kCGImagePropertyGIFDelayTime];
    if (delayTimeProp) {
        frameDuration = [delayTimeProp floatValue];
    }
}

// Many annoying ads specify a 0 duration to make an image flash as quickly as possible.
// We follow Firefox's behavior and use a duration of 100 ms for any frames that specify
// a duration of <= 10 ms. See <rdar://problem/7689300> and <http://webkit.org/b/36082>
// for more information.

if (frameDuration < 0.011f) {
    frameDuration = 0.100f;
}

CFRelease(cfFrameProperties);
return frameDuration;
}