美文网首页基础应用
ios 加载gif图片内存暴增解决方法

ios 加载gif图片内存暴增解决方法

作者: 未来々人生 | 来源:发表于2019-06-19 13:41 被阅读0次

    在项目使用过程中,发现个别手机打开app直接崩溃,最后发现是因为加载动态启动图会内存暴增直接导致崩溃,我们使用的是SDWebImage。目前发现有两种解决办法。有需要的同学可以根据实际情况自行选择。

    一、使用FLAnimatedImage可以解决,但是我遇到了一个问题,使用我们做的gif启动图片,会比实际动画时间慢一倍,从网上下载的gif图片是好的。使用这个的同学可以自行测试。

    使用cocoaPod导入第三方
    pod 'SDWebImage', '~>4.0.0'
    pod 'FLAnimatedImage', '~> 1.0'
    pod 'SDWebImage/GIF'
    
    导入头文件
    #import <FLAnimatedImageView+WebCache.h>
    
    使用方法
    NSURL *imgUrl = [[NSBundle mainBundle] URLForResource:@"1125x2436" withExtension:@"gif"];
        FLAnimatedImage *image = [FLAnimatedImage animatedImageWithGIFData:[NSData dataWithContentsOfURL:imgUrl]];
    FLAnimatedImageView *imageView = [[FLAnimatedImageView alloc] initWithFrame:self.view.bounds];
        imageView.animatedImage = image;
     [self.view addSubview:imageView];
    

    二、使用YYWebImage

    使用cocoapod导入第三方
    pod 'YYWebImage'
    
    导入头文件
    #import <YYWebImage/YYWebImage.h>
    
    使用方法
    UIImageView *imageview = [[YYAnimatedImageView alloc] initWithFrame:self.view.bounds];
    imageview.yy_imageURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"1125x2436" ofType:@"gif"]];
    [self.view addSubview:imageview];
    

    还有另外一种就是不使用gif图片,使用视频播放(推荐使用)比较稳定

    .h文件
    #import <UIKit/UIKit.h>
    
    #define SCREENH [UIScreen mainScreen].bounds.size.height
    #define SCREEMW [UIScreen mainScreen].bounds.size.width
    #define PlayFinishedNotify @"PlayFinishedNotify"
    
    @interface AnimationViewController : UIViewController
    @property (nonatomic, copy) void (^playFinished)();
    @property (nonatomic, strong) NSString *moviePath;//视频路径
    @end
    
    .m文件
    #import "AnimationViewController.h"
    #import <MediaPlayer/MediaPlayer.h>
    @interface AnimationViewController ()
    @property (nonatomic, strong) MPMoviePlayerController *moviePlayer;
    @end
    
    @implementation AnimationViewController
    
    - (void)setMoviePath:(NSString *)moviePath{
        _moviePath = [moviePath copy];
        // 停止之前的播放
        //    [self.moviePlayer stop];
        self.moviePlayer.view.backgroundColor = [UIColor clearColor];
        // 设置播放的路径
        self.moviePlayer.contentURL = [[NSURL alloc] initFileURLWithPath:moviePath];
        [self.moviePlayer prepareToPlay];
    
        [self.moviePlayer play];
    }
    
    -(MPMoviePlayerController *)moviePlayer{
        if (!_moviePlayer) {
            _moviePlayer = [[MPMoviePlayerController alloc]init];
            [_moviePlayer.view setFrame:self.view.bounds];
            //设置自动播放
            [_moviePlayer setShouldAutoplay:NO];
            _moviePlayer.scalingMode = MPMovieScalingModeAspectFill;
            //设置源类型 因为新特性一般都是播放本地的小视频 所以设置源类型为file
            _moviePlayer.movieSourceType = MPMovieSourceTypeUnknown;
            //取消控制视图 如:播放暂停等
            _moviePlayer.controlStyle = MPMovieControlStyleNone;
            [self.view addSubview:_moviePlayer.view];
            //监听播放完成
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playFinsihed) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];
        }
        return _moviePlayer;
    }
    - (void)viewDidLoad {
        [super viewDidLoad];
    //    UIImageView *imageView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    //    imageView.image = [UIImage imageNamed:@"1242X2208_iphone6P"];
    //    self.view = imageView;
    }
    
    - (void)playFinsihed{
        //添加进入按钮
    //    UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
    //    btn.frame = CGRectMake(0, SCREENH - 50, SCREEMW, 50);
    //    [btn setTitle:@"进入" forState:UIControlStateNormal];
    //    [btn addTarget:self action:@selector(btnclick) forControlEvents:UIControlEventTouchUpInside];
    //    [self.moviePlayer.view addSubview:btn];
        self.playFinished();
    
    
        [[NSNotificationCenter defaultCenter]postNotificationName:PlayFinishedNotify object:nil];
    }
    - (void)btnclick{
        //btn点击事件 执行block
        self.playFinished();
    }
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    - (void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
        NSLog(@"AnimationViewController-》释放");
    }
    

    相关文章

      网友评论

        本文标题:ios 加载gif图片内存暴增解决方法

        本文链接:https://www.haomeiwen.com/subject/zkbhqctx.html