zoukankan      html  css  js  c++  java
  • iOS 自定义方法

    示例代码

    ///////////////////////第一种///////////////////////

    //
    //  GifView.h
    //  GIFViewer
    //
    //  Created by xToucher04 on 11-11-9.
    //  Copyright 2011 Toucher. All rights reserved.
    //

    #import <UIKit/UIKit.h>
    #import <ImageIO/ImageIO.h>

    @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


    //例子
    ////
    ////  ViewController.m
    ////  播放动态图片
    ////
    //
    //#import "ViewController.h"
    //#import "GifView.h"
    //
    //@interface ViewController ()
    //
    //@end
    //
    //@implementation ViewController
    //
    //- (void)viewDidLoad {
    //    [super viewDidLoad];
    //    //第一种 用UIImageView中的动画数组播放动画
    //    [self showGifImageMethodOne];
    //    //第二种 用UIWebView显示
    //    [self showGifImageMethodTwo];
    //    //第三种 用第三方GifView显示本地图片
    //    [self showGifImageMethodThree];
    //    //用第三方显示从网络获取的动态图片
    //    [self showGifImageMethodFour];
    //}
    //
    //#pragma mark 播放动态图片方式1 UIImageView
    //-(void)showGifImageMethodOne {
    //    //第一种 用UIImageView中的动画数组播放动画
    //    //创建UIImageView,添加到界面
    //    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 100, 100)];
    //    [self.view addSubview:imageView];
    //    //创建一个数组,数组中按顺序添加要播放的图片(图片为静态的图片)
    //    NSMutableArray *imgArray = [NSMutableArray array];
    //    for (int i=1; i<7; i++) {
    //        UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"clock%02d.png",i]];
    //        [imgArray addObject:image];
    //    }
    //    //把存有UIImage的数组赋给动画图片数组
    //    imageView.animationImages = imgArray;
    //    //设置执行一次完整动画的时长
    //    imageView.animationDuration = 6*0.15;
    //    //动画重复次数 (0为重复播放)
    //    imageView.animationRepeatCount = 0;
    //    //开始播放动画
    //    [imageView startAnimating];
    //    //停止播放动画  - (void)stopAnimating;
    //    //判断是否正在执行动画  - (BOOL)isAnimating;
    //}
    //
    //#pragma mark 播放动态图片方式2 UIWebView
    //-(void)showGifImageMethodTwo {
    //    //第二种 用UIWebView显示
    //    //得到图片的路径
    //    NSString *path = [[NSBundle mainBundle] pathForResource:@"happy" ofType:@"gif"];
    //    //将图片转为NSData
    //    NSData *gifData = [NSData dataWithContentsOfFile:path];
    //    //创建一个webView,添加到界面
    //    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 150, 200, 200)];
    //    [self.view addSubview:webView];
    //    //自动调整尺寸
    //    webView.scalesPageToFit = YES;
    //    //禁止滚动
    //    webView.scrollView.scrollEnabled = NO;
    //    //设置透明效果
    //    webView.backgroundColor = [UIColor clearColor];
    //    webView.opaque = 0;
    //    //加载数据
    //    [webView loadData:gifData MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
    //}
    //
    //#pragma mark 播放动态图片方式3 第三方显示本地动态图片
    //-(void)showGifImageMethodThree {
    //    //方式一
    //    //将图片转为NSData数据
    //    NSData *localData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"bird" ofType:@"gif"]];
    //    //创建一个第三方的View显示图片
    //    GifView *dataView = [[GifView alloc] initWithFrame:CGRectMake(0, 300, 200, 100) data:localData];
    //    [self.view addSubview:dataView];
    //    //方式二
    //    //得到图片的路径
    //    NSString *path = [[NSBundle mainBundle] pathForResource:@"cat" ofType:@"gif"];
    //    GifView *dataView2 = [[GifView alloc] initWithFrame:CGRectMake(200, 300, 150, 100) filePath:path];
    //    [self.view addSubview:dataView2];
    //}
    //
    //#pragma mark 播放动态图片方式3 第三方显示从网络获取的动态图片
    //-(void)showGifImageMethodFour {
    //    // 网络图片
    //    NSData *urlData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://pic19.nipic.com/20120222/8072717_124734762000_2.gif"]];
    //    //创建一个第三方的View显示图片
    //    GifView *dataViewWeb = [[GifView alloc] initWithFrame:CGRectMake(20, 420, 280, 100) data:urlData];
    //    [self.view addSubview:dataViewWeb];
    //}
    //
    //- (void)didReceiveMemoryWarning {
    //    [super didReceiveMemoryWarning];
    //}
    //
    //@end

    ////////////////////////////////

    //
    //  GifView.m
    //  GIFViewer
    //
    //  Created by xToucher04 on 11-11-9.
    //  Copyright 2011 Toucher. All rights reserved.
    //

    #import "GifView.h"
    #import <QuartzCore/QuartzCore.h>

    @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 && _data) {
            gifProperties = [[NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount]
                                                         forKey:(NSString *)kCGImagePropertyGIFDictionary] retain];
           gif = CGImageSourceCreateWithData((CFDataRef)_data, (CFDictionaryRef)gifProperties);
            count =CGImageSourceGetCount(gif);
            timer = [NSTimer scheduledTimerWithTimeInterval:0.12 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

    ///////////////////////第二种///////////////////////

    //
    //  UIImageView+Gif.h
    //  DemoTest1
    //
    //  Created by 李鹏超 on 16/8/11.
    //  Copyright © 2016年 李鹏超. All rights reserved.
    //

    #import <UIKit/UIKit.h>

    @interface UIImageView (Gif)

    -(void)getGifImageWithUrk:(NSURL *)url
                   returnData:(void(^)(NSArray<UIImage *> * imageArray,
                                       NSArray<NSNumber *>*timeArray,
                                       CGFloat totalTime,
                                       NSArray<NSNumber *>* widths,
                                       NSArray<NSNumber *>* heights))dataBlock;

    -(void)yh_setImage:(NSURL *)imageUrl;

    @end

    //使用例子
    //使用代码示例如下:

    //UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 50 , 320, 100)];
    //NSURL * url = [[NSURL alloc]initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"1-1.gif" ofType:nil]];
    //    [imageView yh_setImage:url];
    //    [imageView getGifImageWithUrk:url returnData:^(NSArray<UIImage *> *imageArray, NSArray<NSNumber *> *timeArray, CGFloat totalTime, NSArray<NSNumber *> *widths, NSArray<NSNumber *> *heights) {
    //
    //    }];

    //SDWebImage中的方法例子
    //  self.loadingImageView.image = [UIImage sd_animatedGIFWithData:imageData];
    //#import <UIKit/UIKit.h>
    //
    //@interface UIImage (GIF)
    //
    //+ (UIImage *)sd_animatedGIFNamed:(NSString *)name;
    //
    //+ (UIImage *)sd_animatedGIFWithData:(NSData *)data;
    //
    //- (UIImage *)sd_animatedImageByScalingAndCroppingToSize:(CGSize)size;
    //
    //@end


    //getHUb -- 第三方 FLAnimatedImage

    ////////////////////////////

    //
    //  UIImageView+Gif.m
    //  DemoTest1
    //
    //  Created by 李鹏超 on 16/8/11.
    //  Copyright © 2016年 李鹏超. All rights reserved.
    //

    #import "UIImageView+Gif.h"
    #import <ImageIO/ImageIO.h>

    @implementation UIImageView (Gif)

    //解析gif文件数据的方法 block中会将解析的数据传递出来
    -(void)getGifImageWithUrk:(NSURL *)url
                   returnData:(void(^)(NSArray<UIImage *> * imageArray,
                                       NSArray<NSNumber *>*timeArray,
                                       CGFloat totalTime,
                                       NSArray<NSNumber *>* widths,
                                       NSArray<NSNumber *>* heights))dataBlock {
        //通过文件的url来将gif文件读取为图片数据引用
        CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
        //获取gif文件中图片的个数
        size_t count = CGImageSourceGetCount(source);
        //定义一个变量记录gif播放一轮的时间
        float allTime=0;
        //存放所有图片
        NSMutableArray * imageArray = [[NSMutableArray alloc]init];
        //存放每一帧播放的时间
        NSMutableArray * timeArray = [[NSMutableArray alloc]init];
        //存放每张图片的宽度 (一般在一个gif文件中,所有图片尺寸都会一样)
        NSMutableArray * widthArray = [[NSMutableArray alloc]init];
        //存放每张图片的高度
        NSMutableArray * heightArray = [[NSMutableArray alloc]init];
        //遍历
        for (size_t i=0; i<count; i++) {
            CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
            [imageArray addObject:(__bridge UIImage *)(image)];
            CGImageRelease(image);
            //获取图片信息
            NSDictionary * info = (__bridge NSDictionary*)CGImageSourceCopyPropertiesAtIndex(source, i, NULL);
            CGFloat width = [[info objectForKey:(__bridge NSString *)kCGImagePropertyPixelWidth] floatValue];
            CGFloat height = [[info objectForKey:(__bridge NSString *)kCGImagePropertyPixelHeight] floatValue];
            [widthArray addObject:[NSNumber numberWithFloat:width]];
            [heightArray addObject:[NSNumber numberWithFloat:height]];
            NSDictionary * timeDic = [info objectForKey:(__bridge NSString *)kCGImagePropertyGIFDictionary];
            CGFloat time = [[timeDic objectForKey:(__bridge NSString *)kCGImagePropertyGIFDelayTime]floatValue];
            allTime+=time;
            [timeArray addObject:[NSNumber numberWithFloat:time]];
        }
        dataBlock(imageArray,timeArray,allTime,widthArray,heightArray);
    }

    //为UIImageView添加一个设置gif图内容的方法:

    -(void)yh_setImage:(NSURL *)imageUrl{
        __weak id __self = self;
        [self getGifImageWithUrk:imageUrl returnData:^(NSArray<UIImage *> *imageArray, NSArray<NSNumber *> *timeArray, CGFloat totalTime, NSArray<NSNumber *> *widths, NSArray<NSNumber *> *heights) {
            //添加帧动画
            CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
            NSMutableArray * times = [[NSMutableArray alloc]init];
            float currentTime = 0;
            //设置每一帧的时间占比
            for (int i=0; i<imageArray.count; i++) {
                [times addObject:[NSNumber numberWithFloat:currentTime/totalTime]];
                currentTime+=[timeArray[i] floatValue];
            }
            [animation setKeyTimes:times];
            [animation setValues:imageArray];
            [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
            //设置循环
            animation.repeatCount= MAXFLOAT;
            //设置播放总时长
            animation.duration = totalTime;
            //Layer层添加
            [[(UIImageView *)__self layer]addAnimation:animation forKey:@"gifAnimation"];
        }];
    }

    @end

  • 相关阅读:
    C#开发串口总结,并提炼串口辅助类到公用类库中
    sharepoint Lists Web service 用法
    .NET简谈策略模式
    细说 Form (表单)
    步步为营 SharePoint 开发学习笔记系列 一、简介
    Memcached进行缓存层设计
    各大主流.Net的IOC框架性能测试比较
    十年磨一剑,BloodyAngel!
    hosts
    新浪微薄的挂件
  • 原文地址:https://www.cnblogs.com/yujidewu/p/6186990.html
Copyright © 2011-2022 走看看