zoukankan      html  css  js  c++  java
  • iOS加载动态图的两种方法

    view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];

    NSString *imagePath =[[NSBundle mainBundle] pathForResource:@"csjg" ofType:@"gif"];

    CGImageSourceRef cImageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:imagePath], NULL);

    size_t imageCount = CGImageSourceGetCount(cImageSource);

    NSMutableArray *images = [[NSMutableArray alloc] initWithCapacity:imageCount];

    NSMutableArray *times = [[NSMutableArray alloc] initWithCapacity:imageCount];

    NSMutableArray *keyTimes = [[NSMutableArray alloc] initWithCapacity:imageCount];

    float totalTime = 0;

    for (size_t i = 0; i < imageCount; i++) {

    CGImageRef cgimage= CGImageSourceCreateImageAtIndex(cImageSource, i, NULL);

    [images addObject:(__bridge id)cgimage];

    CGImageRelease(cgimage);

    NSDictionary *properties = (__bridge NSDictionary *)CGImageSourceCopyPropertiesAtIndex(cImageSource, i, NULL);

    NSDictionary *gifProperties = [properties valueForKey:(__bridge NSString *)kCGImagePropertyGIFDictionary];

    NSString *gifDelayTime = [gifProperties valueForKey:(__bridge NSString* )kCGImagePropertyGIFDelayTime];

    [times addObject:gifDelayTime];

    totalTime += [gifDelayTime floatValue];

    // _size.width = [[properties valueForKey:(NSString*)kCGImagePropertyPixelWidth] floatValue];

    // _size.height = [[properties valueForKey:(NSString*)kCGImagePropertyPixelHeight] floatValue];

    }

    float currentTime = 0;

    for (size_t i = 0; i < times.count; i++) {

    float keyTime = currentTime / totalTime;

    [keyTimes addObject:[NSNumber numberWithFloat:keyTime]];

    currentTime += [[times objectAtIndex:i] floatValue];

    }

    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];

    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];

    [animation setValues:images];

    [animation setKeyTimes:keyTimes];

    animation.duration = totalTime;

    animation.repeatCount = HUGE_VALF;

    [view.layer addAnimation:animation forKey:@"gifAnimation"];

    //

    // GifView.h

    // GIFViewer

    //

    // Created by xToucher04 on 11-11-9.

    // Copyright 2011 Toucher. All rights reserved.

    //

    #import 

    #import 

    @interface GifView : UIView {

    CGImageSourceRef gif;

    NSDictionary *gifProperties;

    size_t index;

    size_t count;

    NSTimer *timer;

    }

    - (id)initWithFrame:(CGRect)frame filePath:(NSString *)_filePath;

    - (id)initWithFrame:(CGRect)frame data:(NSData *)_data;

    @end



    //

    // GifView.m

    // GIFViewer

    //

    // Created by xToucher04 on 11-11-9.

    // Copyright 2011 Toucher. All rights reserved.

    //

    #import "GifView.h"

    #import 

    @implementation GifView

    - (id)initWithFrame:(CGRect)frame filePath:(NSString *)_filePath{

    self = [super initWithFrame:frame];

    if (self) {

    gifProperties = [[NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount]

    forKey:(NSString *)kCGImagePropertyGIFDictionary] retain];

    gif = CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:_filePath], (CFDictionaryRef)gifProperties);

    count =CGImageSourceGetCount(gif);

    timer = [NSTimer scheduledTimerWithTimeInterval:0.12 target:self selector:@selector(play) userInfo:nil repeats:YES];

    [timer fire];

    }

    return self;

    }

    - (id)initWithFrame:(CGRect)frame data:(NSData *)_data{

    self = [super initWithFrame:frame];

    if (self) {

    gifProperties = [[NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount]

    forKey:(NSString *)kCGImagePropertyGIFDictionary] retain];

    // gif = CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:_filePath], (CFDictionaryRef)gifProperties);

    gif = CGImageSourceCreateWithData((CFDataRef)_data, (CFDictionaryRef)gifProperties);

    count =CGImageSourceGetCount(gif);

    timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(play) userInfo:nil repeats:YES];

    [timer fire];

    }

    return self;

    }

    -(void)play

    {

    index ++;

    index = index%count;

    CGImageRef ref = CGImageSourceCreateImageAtIndex(gif, index, (CFDictionaryRef)gifProperties);

    self.layer.contents = (id)ref;

    CFRelease(ref);

    }

    -(void)removeFromSuperview

    {

    NSLog(@"removeFromSuperview");

    [timer invalidate];

    timer = nil;

    [super removeFromSuperview];

    }

    - (void)dealloc {

    NSLog(@"dealloc");

    CFRelease(gif);

    [gifProperties release];

    [super dealloc];

    }

    @end

    使用的时候:

    GifView *pathView =[[GifView alloc] initWithFrame:CGRectMake(100, 0, 100, 100) filePath:[[NSBundle mainBundle] pathForResource:@"csjg" ofType:@"gif"]];

  • 相关阅读:
    教材全解
    知乎、博客园等开放API接口
    学习正则表达式就这么简单
    C#操作域用户ADHelper
    跨线程时使用静态扩展方法更新控件
    C#中的WinForm的消息机制简述,及消息机制下Invoke,和BeginInvoke的使用和区别
    WinForm 捕获异常 Application.ThreadException + AppDomain.CurrentDomain.UnhandledException
    Winform异常处理之ThreadException、unhandledException及多线程异常处理
    深入理解C#中的IDisposable接口
    批处理应用的几个技巧
  • 原文地址:https://www.cnblogs.com/zylin/p/5056801.html
Copyright © 2011-2022 走看看