iOS开发-Lottie实现下拉刷新动画效果

news2025/4/22 12:27:16

iOS开发-Lottie实现下拉刷新动画效果

在开发过程中,有时候需要自定义下拉刷新控件,这里使用Lottie实现下拉刷新动画效果。

一、Lottie

Lottie 是一个应用十分广泛动画库,适用于Android、iOS、Web、ReactNative、Windows的库,它解析了用Bodymovin导出为json的Adobe After Effects动画,并在移动和网络上进行了原生渲染。

Lottie方法方案是由设计师出动画,导出为json,给前端、iOS、Android播放。

在iOS开发中,我们需要使用lottie-ios库,在podfile中引入库

pod ‘lottie-ios’, ‘~> 2.5.3’

可以使用LOTAnimationView来进行动画播放。

二、LOTAnimationView播放动画

比如我们有一个loading_header,如图
在这里插入图片描述

使用LOTAnimationView来进行播放动画

- (LOTAnimationView *)animationView {
    if (!_animationView) {
        _animationView = [[LOTAnimationView alloc] initWithFrame:CGRectZero];
        _animationView.backgroundColor = [UIColor clearColor];
        _animationView.frame = CGRectMake(0.0, 0.0, kAnimationSize, kAnimationSize);
        _animationView.loopAnimation = YES;
        [_animationView setAnimationNamed:@"loading_header"];
    }
    return _animationView;
}

播放动画

- (void)startAnimation {
    [self.animationView play];
}

停止动画播放

- (void)stopAnimation {
    [self.animationView stop];
}

完整代码如下

INRefreshGifLoadingView.h

#import <UIKit/UIKit.h>

@interface INRefreshGifLoadingView : UIView

- (void)displayIndicator:(CGFloat)precent;

- (void)startAnimation;

- (void)stopAnimation;

@end

INRefreshGifLoadingView.m

#import "INRefreshGifLoadingView.h"
#import <Lottie/Lottie.h>

#import "UIColor+Addition.h"
#import "UIImageView+WebCache.h"

static CGFloat kAnimationSize = 60.0;

@interface INRefreshGifLoadingView ()

@property (nonatomic, strong) LOTAnimationView *animationView;

@end

@implementation INRefreshGifLoadingView

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self addSubview:self.animationView];
        [self layoutFrame];
    }
    return self;
}

- (void)layoutFrame {
    self.animationView.center = self.center;
}

#pragma mark - Display
- (void)displayIndicator:(CGFloat)precent {
    
}

- (void)startAnimation {
    [self.animationView play];
}

- (void)stopAnimation {
    [self.animationView stop];
}

#pragma mark - SETTER/GETTER
- (LOTAnimationView *)animationView {
    if (!_animationView) {
        _animationView = [[LOTAnimationView alloc] initWithFrame:CGRectZero];
        _animationView.backgroundColor = [UIColor clearColor];
        _animationView.frame = CGRectMake(0.0, 0.0, kAnimationSize, kAnimationSize);
        _animationView.loopAnimation = YES;
        [_animationView setAnimationNamed:@"loading_header"];
    }
    return _animationView;
}

@end

三、使用MJRefresh进行下拉刷新播放

在使用MJRefresh时候,我们继承MJRefreshStateHeader来实现lottie动画播放效果。

根据MJRefreshState来进行控制动画是否播放

完整代码如下

INRefreshHeader.h

#import "MJRefresh.h"
#import "INRefreshGifLoadingView.h"

@interface INRefreshHeader : MJRefreshStateHeader

@property (nonatomic, assign) BOOL showInsetTop;

@property (nonatomic, strong) INRefreshGifLoadingView *gifLoadingView;

@end


INRefreshHeader.m

#import "INRefreshHeader.h"

@implementation INRefreshHeader

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.lastUpdatedTimeLabel.hidden = YES;
        self.stateLabel.hidden = YES;
        [self addSubview:self.gifLoadingView];
    }
    return self;
}

- (INRefreshGifLoadingView *)gifLoadingView {
    if (!_gifLoadingView) {
        _gifLoadingView = [[INRefreshGifLoadingView alloc] initWithFrame:CGRectMake(0.0, 0.0, CGRectGetWidth([UIScreen mainScreen].bounds), self.bounds.size.height)];
    }
    return _gifLoadingView;
}

- (void)setState:(MJRefreshState)state {
    MJRefreshCheckState
    
    // 根据状态做事情
    if (state == MJRefreshStateIdle) {
        if (oldState == MJRefreshStateRefreshing) {
            self.gifLoadingView.alpha = 1.0;

            // 如果执行完动画发现不是idle状态,就直接返回,进入其他状态
            if (self.state != MJRefreshStateIdle) return;
            
            
            self.gifLoadingView.alpha = 1.0;

            
            [self.gifLoadingView stopAnimation];

        } else {
            
            [self.gifLoadingView stopAnimation];

        }
    } else if (state == MJRefreshStatePulling) {
        
        [self.gifLoadingView stopAnimation];

    } else if (state == MJRefreshStateRefreshing) {
        
        [self.gifLoadingView startAnimation];
    }
}

- (void)prepare {
    [super prepare];
    self.mj_h = 70.0;
}

- (void)placeSubviews {
    [super placeSubviews];
    
    CGFloat centerX = self.mj_w * 0.5;
    CGFloat centerY = self.mj_h * 0.5;
    
    self.gifLoadingView.center = CGPointMake(centerX, centerY);
}

/** 当scrollView的contentOffset发生改变的时候调用 */
- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change {
    [super scrollViewContentOffsetDidChange:change];
    NSLog(@"change:%@",change);
    
    CGPoint old = [change[@"old"] CGPointValue];
    CGPoint new = [change[@"new"] CGPointValue];
    
    CGFloat precent = -new.y/self.mj_h;
    
    [self.gifLoadingView displayIndicator:precent];
}

/** 当scrollView的contentSize发生改变的时候调用 */
- (void)scrollViewContentSizeDidChange:(NSDictionary *)change {
    [super scrollViewContentSizeDidChange:change];
}

/** 当scrollView的拖拽状态发生改变的时候调用 */
- (void)scrollViewPanStateDidChange:(NSDictionary *)change {
    [super scrollViewPanStateDidChange:change];
}

- (void)setShowInsetTop:(BOOL)showInsetTop {
    _showInsetTop = showInsetTop;
    
}

- (void)backInitState {
    
}

@end

四、在TableView使用Refresh

在设置UITableView 的mj_header,来进行使用下拉刷新动画效果。

- (void)configureRefresh {
    __weak typeof(self) weakSelf = self;
    INRefreshHeader *header = [INRefreshHeader headerWithRefreshingBlock:^{
        [weakSelf refreshData];
    }];
    
    self.noteView.tableView.mj_header = header;
}

- (void)refreshData {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.noteView.tableView.mj_header endRefreshing];
    });
}

- (void)loadMoreData {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.noteView.tableView.mj_header endRefreshing];
    });
}

Lottie实现下拉刷新动画效果如下

在这里插入图片描述

五、小结

iOS开发-Lottie实现下拉刷新动画效果

学习记录,每天不停进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1136671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

洞察运营机会的数据分析利器

这套分析方法包括5个分析工具&#xff1a; 用“描述性统计”来快速了解数据的整体特点。用“变化分析”来寻找数据的问题和突破口。用“指标体系”来深度洞察变化背后的原因。用“相关性分析”来精确判断原因的影响程度。用“趋势预测”来科学预测未来数据的走势&#xff0c;

OpenLayers入门,OpenLayers从vue的assets资源路径加载geojson文件并解析数据叠加到地图上,以加载世界各国边界为例

专栏目录: OpenLayers入门教程汇总目录 前言 本章以加载世界各国边界的GeoJSON格式数据为例,讲解如何使用OpenLayers从vue的assets资源路径加载geojson文件并解析数据叠加到地图上。 二、依赖和使用 "ol": "^6.15.1"使用npm安装依赖npm install ol@…

我是这样保持精力充沛的

精力管理就好比是计算机的内存清理&#xff0c;你以为关掉一些程序就行了&#xff0c;结果你还是卡成翔。 我的现状 雷猴啊&#xff0c;我是一个临期程序员。打过几年工&#xff0c;被好几个同事问过我为什么精力这么旺盛。 这两年我大多数情况都是早上8点前就到公司*(原本9点上…

LVS-DR模式+keepalived+nginx+tomcat实现动静分离、负载均衡、高可用实验

实验条件&#xff1a; test2——20.0.0.20——主服务器——ipvsadm、keepalived服务 test3——20.0.0.30——备服务器——ipvsadm、keepalived服务 nginx5——20.0.0.51——后端真实服务器1&#xff08;tomcat的代理服务器&#xff09;——nginx服务 nginx6——20.0.0.61—…

buuctf_练[CISCN2019 华东南赛区]Web4

[CISCN2019 华东南赛区]Web4 文章目录 [CISCN2019 华东南赛区]Web4掌握知识解题思路代码分析正式解题 关键paylaod 掌握知识 ​ 根据url地址传参结构来判断php后端还是python后端&#xff1b;uuid.getnode()函数的了解&#xff0c;可以返回主机MAC地址十六进制&#xff1b;pyt…

Vue进阶(幺陆捌)项目部署后IE报 SCRIPT1002:语法错误 解决方案探讨

文章目录 一、前言二、组件懒加载2.1 什么是懒加载2.2 如何实现懒加载 三、延伸阅读 软件程序唤醒3.1 protocolCheck 实现3.2 自定义实现 四、拓展阅读 一、前言 Vue项目改造升级后&#xff0c;原本本地热部署后IE可正常打开的项目出现页面白屏且控制台给出SCRIPT1002:语法错误…

ssh连接远程服务器,并在终端安装anaconda

官网下载安装&#xff1a;anaconda2023.09版本&#xff08;官网地址&#xff1a;https://www.anaconda.com/download#downloads&#xff09; wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh使用阿里云镜像下载安装&#xff0c;官网下载太慢。阿…

【ModbusTCP协议】

ModbusTCP协议 一、搭建一个ModbusTCP环境二、ModbusTCP通信协议报文格式ModbusTCP的特点 一、搭建一个ModbusTCP环境 搭建一个ModbusTCP环境 1、使用ModbusSlave 2、可以用西门子PLC来做 使用西门子搭建ModbusTCP环境&#xff0c;就需要先搭建一个西门子PLC仿真环境 下载软件P…

ES6新特性:let关键字详解

文章目录 1 声明提升2 作用域3 重复声明 在JavaScript中&#xff0c;let 和 var 都是声明变量的关键字&#xff0c;但在用法和作用域方面有一些区别。 let 是ES6引入的新的声明变量的关键字&#xff0c;它与 var 相比&#xff0c;更加严格&#xff0c;语法更加规范&#xff0c…

如何租用香港写字楼,需要注意哪些事项

1. 确定您的所需 你需要多少空间 在一切开始之前&#xff0c;您需要确切地知道您的业务(即您、您现有的员工和预计的招聘、您的访客或客户以及您想要的设施如食品储藏室、接待处、服务器机房甚至健身房&#xff0c;婴儿护理室等)&#xff0c;以实用面积计算需要多少空间。空间…

「滚雪球学Java」:数组(章节汇总)

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

文化融合:TikTok如何弥合跨文化差异

随着全球化的加速和数字媒体的崛起&#xff0c;社交媒体平台已经成为连接世界各地人们的纽带。其中&#xff0c;TikTok作为一个引领者&#xff0c;正在以惊人的速度消除跨文化差异&#xff0c;促进文化融合&#xff0c;使人们更加了解和尊重不同背景和传统。 本文将深入探讨Ti…

后端实现大文件分片上传

项目框架 net6 webapi 放开上传大小限制 放开代码 | 框架层限制 在 Program.cs 文件中添加如下代码 不然会出现下面的限制错误 From表单限制&#xff1a;Failed to read the request form. Multipart body length limit 134217728 exceeded 请求体超长&#xff1a;Request bo…

深入探究ASEMI肖特基二极管MBR60100PT的材质

编辑-Z 在电子零件领域中&#xff0c;肖特基二极管MBR60100PT因其出色的性能和广泛的应用而显得尤为关键。理解其材质不仅有助于我们深入理解其运作原理&#xff0c;也有助于我们做出更合适的电子设计。那么&#xff0c;肖特基二极管MBR60100PT是什么材质呢? 首先&#xff0c…

java版直播商城平台规划及常见的营销模式有哪些?电商源码/小程序/三级分销/手机商城免费搭建

涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis …

Visual C++编程初学者疑难问题大集合(一)

初学者在学习visual c时问题很多&#xff0c;有意思的是&#xff0c;很多问题教材上都不说&#xff0c;后台有不少小伙伴问我相关问题&#xff0c;我于是总结一下。以供学习visual c的小伙伴少走弯路。 问题一&#xff1a;怎么样快速运行一个程序&#xff1f; 鼠标双击Visual…

我的课程居然上热门了

记录一下&#xff0c;我的课程上热门了&#xff0c;排名第三&#xff0c;非常的开心

了解WebGL三维技术

文章目录 什么是WebGLWebGLOpenGL 什么是WebGL WebGL WebGL是一项结合了HTML5和JavaScript&#xff0c;用来在网页上绘制和渲染复杂三维图形的技术。WebGL通过JavaScript操作OpenGL接口的标准&#xff0c;把三维空间图像显示在二维的屏幕上。所以它的本质就是JavaScript操作O…

Leetcode—2520.统计能整除数字的位数【简单】

2023每日刷题&#xff08;十&#xff09; Leetcode—2520.统计能整除数字的位数 实现代码 int countDigits(int num){int ans 0;int val 0;int tmp num;while(tmp) {val tmp % 10;if(num % val 0) {ans;}tmp / 10;}return ans; } 运行结果 之后我会持续更新&#xff0c;…

安装虚拟机找不到虚拟网啦1(eth1)不出现

一、安装虚拟机找不到虚拟网啦1&#xff08;eth1&#xff09;不出现 1、先安装virtualbox 2、再安装vagrant 3、在windows使用ipconfig没有VirtualBoxHost-OnlyNetWork解决方法 1) 解决办法 在windows的设置中找到 网络和Internet 选项&#xff0c;选择右侧 更改适配器选项 …