zoukankan      html  css  js  c++  java
  • iOS gif图显示问题

    问题

    有时候需要显示gif动态图,让界面更加的绚丽,但是iOS默认只支持png,gpg图片。那么如何才能显示gif图呢?

    解决方式

    1. 添加框架

      CoreGraphics.framework

      ImageIO.framework

    2. 引入SCGIFImageView类

    SCGIFImageView.h

        #import <UIKit/UIKit.h>
    
        @interface SCGIFImageFrame : NSObject {
    
        }
        @property (nonatomic) double duration;
        @property (nonatomic, retain) UIImage* image;
    
        @end
    
        @interface SCGIFImageView : UIImageView {
            NSInteger _currentImageIndex;
        }
        @property (nonatomic, retain) NSArray* imageFrameArray;
        @property (nonatomic, retain) NSTimer* timer;
        @property (nonatomic, assign) NSInteger sumCount;
    
        //Setting this value to pause or continue animation;
        @property (nonatomic) BOOL animating;
    
        - (void)setData:(NSData*)imageData;
        @end
    

    SCGIFImageView.m

        #import "SCGIFImageView.h"
        #import <ImageIO/ImageIO.h>
    
        @implementation SCGIFImageFrame
        @synthesize image = _image;
        @synthesize duration = _duration;
    
    
        @end
    
        @interface SCGIFImageView ()
    
        - (void)resetTimer;
    
        - (void)showNextImage;
    
        @end
    
        @implementation SCGIFImageView
        @synthesize imageFrameArray = _imageFrameArray;
        @synthesize timer = _timer;
        @synthesize animating = _animating;
    
    
        - (void)resetTimer {
            if (_timer && _timer.isValid) {
                [_timer invalidate];
            }
    
            self.timer = nil;
        }
    
        - (void)setData:(NSData *)imageData {
            if (!imageData) {
                return;
            }
            [self resetTimer];
            CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)imageData, NULL);
    size_t count = CGImageSourceGetCount(source);
    
            NSMutableArray* tmpArray = [NSMutableArray array];
    
            for (size_t i = 0; i < count; i++) {
                SCGIFImageFrame* gifImage = [[SCGIFImageFrame alloc] init];
    
                CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
                gifImage.image = [UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];
    
                NSDictionary* frameProperties = CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(source, i, NULL));
                gifImage.duration = [[[frameProperties objectForKey:(NSString*)kCGImagePropertyGIFDictionary] objectForKey:(NSString*)kCGImagePropertyGIFDelayTime] doubleValue];
                gifImage.duration = MAX(gifImage.duration, 0.01);
    
                [tmpArray addObject:gifImage];
    
                CGImageRelease(image);
            }
            CFRelease(source);
    
            self.imageFrameArray = nil;
            if (tmpArray.count > 1) {
                self.imageFrameArray = tmpArray;
                _currentImageIndex = -1;
                _animating = YES;
                [self showNextImage];
            } else {
                self.image = [UIImage imageWithData:imageData];
            }
        }
    
    
        - (void)setImage:(UIImage *)image {
            [super setImage:image];
            [self resetTimer];
            self.imageFrameArray = nil;
            _animating = NO;
        }
    
        - (void)showNextImage {
            if (_sumCount > 0) {
                _animating = _sumCount - 1 == _currentImageIndex ? NO : YES;
            }
            if (!_animating) {
                return;
            }
            _currentImageIndex = (++_currentImageIndex) % _imageFrameArray.count;
            SCGIFImageFrame* gifImage = [_imageFrameArray objectAtIndex:_currentImageIndex];
            [super setImage:[gifImage image]];
            self.timer = [NSTimer scheduledTimerWithTimeInterval:gifImage.duration target:self          selector:@selector(showNextImage) userInfo:nil repeats:NO];
        }
    
        - (void)setAnimating:(BOOL)animating {
            if (_imageFrameArray.count < 2) {
                _animating = animating;
                return;
            }
    
            if (!_animating && animating) {
                //continue
                _animating = animating;
                if (!_timer) {
                    [self showNextImage];
                }
            } else if (_animating && !animating) {
                //stop
                _animating = animating;
                [self resetTimer];
            }
        }
    
        @end
    
    1. 添加gif图片

      在Images.xcassets中添加需要的gif动态图。

    2. 使用方式

      • 引入头文件SCGIFImageView.h
      • 在需要的添加的地方添加以下代码

           NSString* filePath = [[NSBundle mainBundle] pathForResource:@"6plus_hover.gif" ofType:nil];
           NSData* imageData = [NSData dataWithContentsOfFile:filePath];
        
          SCGIFImageView* gifImageView = [[SCGIFImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];
          [gifImageView setData:imageData];
          [gifImageView setSumCount:gifImageView.imageFrameArray.count];//设置只循环一次,不设置无限循环
          [self.view addSubview:gifImageView];
        
  • 相关阅读:
    Struts2-Spring和Hibernate整合
    windows下使用Eclipse编译执行MapReduce程序 Hadoop2.6.0/Ubuntu
    Android 基于Netty的消息推送方案之对象的传递(四)
    基于JQuery实现表单元素值的回写
    iOS 从UITableViewController中分离数据源
    navicat premium 的使用——navicat 连接MySQL数据库
    【甘道夫】Ubuntu14 server + Hadoop2.2.0环境下Sqoop1.99.3部署记录
    罗永浩和锤子手机:对不起,我被你打动了
    用C语言解决迷宫问题
    Android利用reative_layout生成梅花界面
  • 原文地址:https://www.cnblogs.com/AliliWl/p/4895285.html
Copyright © 2011-2022 走看看