zoukankan      html  css  js  c++  java
  • iOS播放动态图片gif

    iOS播放动态图片gif

    播放多张静态图片

    • 需要多张连续的静态图片,这个最占内存
    /// 1、原生播放动态图片(轮流播放多张静态图片)
    - (void)animationImages {
        //创建UIImageView,添加到界面
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 200, 300)];
        [self.view addSubview:imageView];
        imageView.center = self.view.center;
        //创建一个数组,数组中按顺序添加要播放的图片(图片为静态的图片)
        NSMutableArray *imgArray = [NSMutableArray array];
        for (int i=1; i<23; i++) {
            UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"pickView%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;
    

    UIWebView实现动画效果

    • 内存占用39M
    /// 2、播放动态图片(gif,UIWebView实现),内存占用39M
    - (void)animationImagesWithUIWebView {
        //创建一个webView,添加到界面
        UIWebView *web = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 300)];
        [self.view addSubview:web];
        
        //得到图片的路径
        NSString *path = [[NSBundle mainBundle] pathForResource:@"pickView使用" ofType:@"gif"];
        //将图片转为NSData
        NSData *gifData = [NSData dataWithContentsOfFile:path];
        //自动调整尺寸
        web.scalesPageToFit = YES;
        //禁止滚动
        web.scrollView.scrollEnabled = NO;
        //设置透明效果
        web.backgroundColor = [UIColor clearColor];
        web.opaque = 0;
        //加载数据
        [web loadData:gifData MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
    }
    

    YYImage实现

    • 使用YYImage 来实现动画,占用30M
    /// 3、播放动态图片(gif,YYKit实现),内存占用30M
    - (void)animationImagesWithYYImage {
        // YYImage
        YYImage *image = [YYImage imageNamed:@"pickView使用"];
        YYAnimatedImageView *imageView = [[YYAnimatedImageView alloc] initWithImage:image];
        [self.view addSubview:imageView];
    }
    
    • YYImage 的内存优化还是相当不错的,如果条件允许,不妨试一下。

    YYImage其他方法

    • 1、方法imageNamed
    /// 内存占用,YYImage 重写的imageNamed和原生的内存占用差别不大
    - (void)YYImageTest2 {
        // 循环500次测试
        for (NSInteger i = 0;  i < 500; i ++ ) {
            
    //        UIImage *image2 = [UIImage imageNamed:@"pickView01"];
    //        UIImageView *imageView3 = [[UIImageView alloc] initWithImage:image2];
    //        [self.view addSubview:imageView3];
            
            YYImage *image = [YYImage imageNamed:@"1"];
            UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
            [self.view addSubview:imageView];
        }
    }
    
    • 2、方法imageWithData
    /// 内存占用,YYImage 重写的imageWithData会对内存进行优化,降低内存占用
    - (void)YYImageTest1 {
        // 循环100次测试
        for (NSInteger i = 0;  i < 100; i ++ ) {
            
            UIImage *image2 = [UIImage imageNamed:@"1"];
            NSData *data = UIImagePNGRepresentation(image2);
    //        UIImage *image3 = [UIImage imageWithData:data scale:1]; // 原始方法加载的图片内存中没情况,会一直累加,大概68M
            YYImage *image3 = [YYImage imageWithData:data scale:1];// 每次for循环结束都会回收内存,大概30M,区别很明显
            UIImageView *imageView3 = [[UIImageView alloc] initWithImage:image3];
            [self.view addSubview:imageView3];
        }
    }
    
    • 3、iOS 信号量机制使用
      • YYImage类中用到了信号量来保证同步
    /// iOS 信号量机制使用
    - (void)seamaphore  {
        int data = 3;
        __block int mainData = 0;
        __block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
        
        dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);
        
        dispatch_async(queue, ^(void) {
            int sum = 0;
            for(int i = 0; i < 444445; i++)
            {
                sum += data;
                
                NSLog(@" >> Sum: %d", sum);
            }
            // 添加信号量
            dispatch_semaphore_signal(sem);
        });
        // 等待信号量
        dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
        for(int j=0;j<5;j++)
        {
            mainData++;
            NSLog(@">> Main Data: %d",mainData);
        }
    }
    
    • 其他使用和原生的差不多

    YYAnimatedImage

    • 播放动画
    /// 3、播放动态图片(gif,YYKit实现),30M
    - (void)animationImagesWithYYImage {
        // YYImage
        YYImage *image = [YYImage imageNamed:@"pickView使用"];
        _imageView = [[YYAnimatedImageView alloc] initWithImage:image];
        _imageView.autoPlayAnimatedImage = NO;
        [self.view addSubview:_imageView];
    }
    
    // 控制
    - (void)btnClicked:(UIButton *)btn  {
        switch (btn.tag) {
            case 1: // play
            {
                [_imageView startAnimating];
            }
                break;
            case 2: // pause
            {
                
            }
                break;
            case 3: // stop
            {
                [_imageView stopAnimating];
            }
                break;
                
            default:
                break;
        }
    }
    
  • 相关阅读:
    Flink--Table和DataStream和DataSet的集成
    flink-SQL
    Flink的容错
    Flink--基于mysql的sink和source
    Flink--sink到kafka
    Flink在流处理上常见的Source和sink操作
    【计算机网络】-传输层-传输服务的要素
    【计算机网络】-传输层-传输服务
    文件系统-文件的逻辑结构与存取方法
    文件系统-概念
  • 原文地址:https://www.cnblogs.com/songliquan/p/12784421.html
Copyright © 2011-2022 走看看