详解iOS如何让Lottie使用网络资源做动画的实现

 更新时间:2023年02月03日 08:35:22   作者:QYizhong  
这篇文章主要为大家介绍了iOS如何让Lottie使用网络资源做动画实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

背景

手上有需求需要使用CDN资源来让Lottie做动画,但由于动画需要加载图片,而Lottie提供的初始化接口只能加载json配置,Github上的issues也没人回答,因此特地写下本文记录一下方案。

为了实现这个功能还把Lottie看了一遍也是醉了。。。

方案

首先需要明确的一个点是如果你的Lottie资源带图片,那么直接使用LOTAnimationView的initWithContentsOfURL:方法是无法自动加载图片资源的。因为加载图片需要为LOTComposition设置baseURL,但通过url初始化animatonView时,由于json配置需要异步加载,所以该view的sceneModel为空,你无法直接设置,而view内部又没有加载完成的回调,因此只能通过监听sceneModel设置或者生成一个sceneModel传入这两种方式来实现Lottie图片资源加载。

以下介绍实现方式。

1. 实现LOTAnimationDelegate代理

首先需要实现LOTAnimationView的图片请求代理方法。Lottie内部不会自行请求图片,而是通过代理方法的形式将图片请求抛到外部实现。

- (void)animationView:(LOTAnimationView *)animationView fetchResourceWithURL:(NSURL *)url completionHandler:(LOTResourceCompletionHandler)completionHandler {
    [CDNService requestLottieImageWithURL:url completion:^(UIImage * _Nullable image, NSError * _Nullable error) {
        if (completionHandler) {
            completionHandler(image, error);
        }
    }];

}

2. 生成LOTComposition

其次,由于外部业务无法直接感知LOTAnimationView内部生成的LOTComposition的时机,因此可以选择自己生成它,并设置baseURL。

+ (void)requestLottieModelWithURL:(NSURL *)url completion:(void(^)(LOTComposition * _Nullable sceneModel,  NSError * _Nullable error))completion {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
        NSData *animationData = [NSData dataWithContentsOfURL:url];
        if (!animationData) {
            return;
        }
        NSError *error;
        NSDictionary *animationJSON = [NSJSONSerialization JSONObjectWithData:animationData options:0 error:&error];
        if (error || !animationJSON) {
            if (completion) {
                completion(nil, error);
            }
            return;
        }
        LOTComposition *model = [[LOTComposition alloc] initWithJSON:animationJSON withAssetBundle:[NSBundle mainBundle]];
        dispatch_async(dispatch_get_main_queue(), ^(void) {
            [[LOTAnimationCache sharedCache] addAnimation:model forKey:url.absoluteString];
            //注意,这里的baseURL是你的请求path,需要根据你的业务情况自行设置
            model.baseURL = @"https://os.xxx.cn/lottie/animation/";
            model.cacheKey = url.absoluteString;
            if (completion) {
                completion(model, nil);
            }
        });
    });
}

需要注意的是LOTComposition的baseURL设置,不仅需要查看Lottie的json配置文件,还需要关注服务端存储Lottie文件的路径。

假设你有一个叫animation的Lottie资源,那么请先打开配置json观察assets.u的值。这里假设assets.u为"images/",则你需要在服务端存储的文件结构如下:

- animation
    - data.json
    - images
        - img_0.png
        - img_1.png

此时,如果json的请求url是os.xxx.cn/lottie/anim… ,那么需要给LOTComposition的baseURL设置为os.xxx.cn/lottie/anim… 。

3. 初始化LOTAnimationView

最后只需要请求资源并传给LOTAnimationView即可。

- (LOTAnimationView *)animationView {
    if (!_animationView) {
        //注意,如果想先初始化view再请求资源,不要使用new或者init来初始化
        _animationView = [[LOTAnimationView alloc] initWithFrame:CGRectZero];
        _animationView.animationDelegate = self;
        NSURL *url = [NSURL URLWithString:@"https://os.xxx.cn/lottie/animation/data.json"];
        //请求json配置,生成LOTComposition后传给view
        @weakify(self);
        [CCDNService requestLottieModelWithURL:url completion:^(LOTComposition * _Nullable sceneModel, NSError * _Nullable error) {
            @strongify(self);
            self.animationView.sceneModel = sceneModel;
        }];
    }
    return _animationView;
}

以上就是iOS如何让Lottie使用网络资源做动画的详细内容,更多关于iOS Lottie网络资源做动画的资料请关注脚本之家其它相关文章!

相关文章

  • iOS TabBarItem设置红点(未读消息)

    iOS TabBarItem设置红点(未读消息)

    本文主要介绍了iOS利用TabBarItem设置红点(未读消息)的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-04-04
  • IOS 开发之PickerView自定义视图的实例详解

    IOS 开发之PickerView自定义视图的实例详解

    这篇文章主要介绍了IOS 开发之PickerView自定义视图的实例详解的相关资料,这里提供实例帮助大家学习理解这部分知识,需要的朋友可以参考下
    2017-08-08
  • iOS实现音乐播放器图片旋转

    iOS实现音乐播放器图片旋转

    这篇文章主要为大家详细介绍了iOS实现音乐播放器图片旋转,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • iOS CoreData 增删改查详解

    iOS CoreData 增删改查详解

    这篇文章主要为大家详细介绍了iOS CoreData 增删改查的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • IOS开发过程中的消息通知--小红点

    IOS开发过程中的消息通知--小红点

    本文主要介绍了IOS开发过程中的消息通知--小红点的相关知识。大致分为两种方法:系统方法和自定义方法。下面跟着小编一起来看下吧
    2017-04-04
  • IOS React Native FlexBox详解及实例

    IOS React Native FlexBox详解及实例

    这篇文章主要介绍了IOS React Native FlexBox详解的相关资料,并附实例代码,需要的朋友可以参考下
    2016-11-11
  • 针对iOS10新增Api的详细研究

    针对iOS10新增Api的详细研究

    这篇文章主要针对iOS10新增Api进行详细研究,基于Api层面,着重看一些具体用法所做的笔记,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • iOS中利用CAGradientLayer绘制渐变色的方法实例

    iOS中利用CAGradientLayer绘制渐变色的方法实例

    有时候iOS开发中需要使用到渐变色,来给图片或者view盖上一层,使其显示效果更好,所以这篇文章主要给大家介绍了关于iOS中利用CAGradientLayer绘制渐变色的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-11-11
  • 苹果公司推出的新编程语言Swift简介和入门教程

    苹果公司推出的新编程语言Swift简介和入门教程

    这篇文章主要介绍了苹果公司推出的新编程语言Swift简介和入门教程,Swift是苹果于WWDC 2014.6.3发布的编程语言,主要用来替代Objective-C,需要的朋友可以参考下
    2014-06-06
  • iOS如何获取手机的Mac地址

    iOS如何获取手机的Mac地址

    这篇文章主要为大家详细介绍了iOS获取手机的Mac地址的多种方法,感兴趣的小伙伴们可以参考一下
    2016-04-04

最新评论