效果图

闪光灯模式

骨架屏模式

经典动画模式

闪光灯动画.gif

只有骨架屏.gif

经典动画.gif

本项目思维导图

思维导图.JPG

说明

本文将介绍如何将demo集成到你的项目中

均为个人思考,转载请注明出处,谢谢

简要说明

一般情况下,移动端在展示服务器端数据时需要经历

创建视图 - 请求数据 - 得到数据并展示 三个步骤

本框架在未获得到数据的这段空档期内,根据视图已有的位置信息,映射出一组相同的CALayer视图以及部分动画,在获取到数据后,开发者主动结束动画时一并移除掉。

使用流程

第一步:Install

CocoaPods

搜索:pod search TABAnimated

安装:pod 'TABAnimated', '~> x.x.x'

第二步:在AppDelegate的didFinishLaunchingWithOptions方法全局设置TABAnimated的相关属性

初始化目录图.png

// 简单的示例[[TABViewAnimated sharedAnimated]initWithOnlySkeleton];

初始化目录名称是否全局superAnimationType

Default Animation经典动画模式是该属性无效

Shimmer Animation闪光灯模式是该属性无效

OnlySkeleton骨架屏模式是该属性无效

Custom Animation自定义模式否该属性有效

说明:

全局:项目中所有视图的所有动画,都是你所指定的初始化方法的那一种

非全局:父视图通过设置superAnimationType,指定该父视图下的所有子视图的动画类型(默认为经典动画类型)

所以第四种初始化方式和superAnimationType属性的意义:使得项目中可以用两种以上动画类型

Shimmer和OnlySkeleton的动画,不需要为子视图指定动画类型,将默认设置为TABAnimationTypeOnlySkeleton,您可以使用demo查看效果(后面有提到)

选择设置其他TABAnimated的属性:

属性名称适用模式含义默认值

animatedColor所有模式动画颜色0xEEEEEE

animatedDuration经典动画模式伸展来回时长0.4

longToValue经典动画模式伸展变长时长度1.6

shortToValue经典动画模式伸展变短时长度0.6

animatedDurationShimmer闪光灯模式闪光灯移动时长1.5

第三步,父视图需要的操作:在需要动画的view上,将属性animatedStyle设置为TABTableViewAnimationStart,不需要动画的view不用做额外的操作

// UIView和UICollectionView枚举typedef NS_ENUM(NSInteger,TABViewAnimationStyle) {

TABViewAnimationDefault = 0,               // 默认,没有动画

TABViewAnimationStart,                     // 开始动画

TABViewAnimationRuning,                    // 动画中

TABViewAnimationEnd,                       // 结束动画

TABCollectionViewAnimationStart,           // CollectionView 开始动画

TABCollectionViewAnimationRunning,         // CollectionView 动画中

TABCollectionViewAnimationEnd              // CollectionView 结束动画};

// UITableView枚举typedef NS_ENUM(NSInteger,TABViewAnimationStyle) {

TABViewAnimationDefault = 0,    // 没有动画,默认

TABViewAnimationStart,          // 开始动画

TABViewAnimationEnd             // 结束动画};

// UITableView例子- (UITableView *)mainTV {    if (!_mainTV) {

_mainTV = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight)];

_mainTV.animatedStyle = TABTableViewAnimationStart;  // 开启动画

_mainTV.delegate = self;

_mainTV.dataSource = self;

_mainTV.rowHeight = 100;

_mainTV.backgroundColor = [UIColor whiteColor];

_mainTV.estimatedRowHeight = 0;

_mainTV.estimatedSectionFooterHeight = 0;

_mainTV.estimatedSectionHeaderHeight = 0;

_mainTV.separatorStyle = UITableViewCellSeparatorStyleNone;

}    return _mainTV;

}// UIView例子- (TestHeadView *)headView {    if (!_headView) {

_headView = [[TestHeadView alloc]initWithFrame:CGRectMake(0, 0, tab_kScreenWidth, 90)];

_headView.animatedStyle = TABViewAnimationStart;  //开启动画

}    return _headView;

}

第四步,子视图需要的操作 (只有经典动画模式,包括自定义模式下的经典动画需要此操作):

将需要动的组件的属性loadStyle,设置为需要的类型(不需要动的组件不用做额外的操作)

2.(尽量不要使用)属性tabViewWidth,tabViewHeight,其为动画开启时该组件的宽度,高度,有默认值

typedef enum {

TABViewLoadAnimationDefault = 0, //默认没有动画

TABViewLoadAnimationShort,       //动画先变短再变长

TABViewLoadAnimationLong         //动画先变长再变短}TABViewLoadAnimationStyle;          //view动画类型枚举

{        UILabel *lab = [[UILabel alloc]init];

[lab setFont:tab_kFont(15)];

lab.loadStyle = TABViewLoadAnimationLong;

lab.tabViewWidth = 100;

lab.tabViewWidth = 20;

[lab setTextColor:[UIColor blackColor]];

titleLab = lab;

[self.contentView addSubview:lab];

}

第五步:在获取到数据后,停止动画,如下:

//停止动画,并刷新数据_mainTV.animatedStyle = TABTableViewAnimationEnd;

[_mainTV reloadData];

_headView.animatedStyle = TABViewAnimationEnd;

[_headView initWithData:headGame];

注意点(重要):

对于UITableView组件,在加载动画的时候,即未获得数据时,不要设置对应的数值

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *str = @"TestTableViewCell";

TestTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:str];    if (!cell) {

cell = [[TestTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:str];

cell.selectionStyle = UITableViewCellSelectionStyleNone;

}

//在加载动画的时候,即未获得数据时,不要走加载控件数据的方法

if (_mainTV.animatedStyle != TABTableViewAnimationStart) {

[cell initWithData:dataArray[indexPath.row]];

}    return cell;

}

对于UICollectionView组件:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"TestCollectionViewCell";

TestCollectionViewCell *cell = (TestCollectionViewCell *)

[collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

// 需要加上!!!

[cell setNeedsLayout];

// 在加载动画的时候,即未获得数据时,不要走加载控件数据的方法

if (_collectionView.animatedStyle != TABCollectionViewAnimationStart) {

[cell initWithData:dataArray[indexPath.row]];

}    return cell;

}

特别注意UIView和UICollectionView用的是同一枚举

再啰嗦一下:

本文只是简单的引导作用,你可以用本框架订制更精美的效果,具体例子github上代码都有哦~

遇到问题先去demo上看看有没有使用示例,实在不行联系我~

最后:

欢迎在下方讨论,同时,如果觉得对你有所帮助的话,能在github上star一下就更好了~

如有问题,可以联系我,wx:awh199833

android 骨架屏刷新动画,ios - 原生骨架屏,网络加载过渡动画的封装相关推荐

  1. html实现图片加载动画效果,HTML5+javascript实现图片加载进度动画效果

    在网上找资料的时候,看到网上有图片加载进度的效果,手痒就自己也写了一个. 图片加载完后,隐藏loading效果. 想看加载效果,请ctrel+F5强制刷新或者清理缓存. 效果预览: 0% 代码如下: ...

  2. 安卓设置菊花动画_Android实现ProgressBar旋转菊花加载的动画

    Android实现ProgressBar旋转菊花加载的动画 在一些常见到的加载中需要显示一个加载动画,如旋转的菊花这样的动画效果,开发中有两种方案,一种是直接让设计师给出一个gif图片,然后写入到布局 ...

  3. 安卓设置菊花动画_Android实现ProgressBar旋转菊花加载的动画详解

    Android实现ProgressBar旋转菊花加载的动画 在一些常见到的加载中需要显示一个加载动画,如旋转的菊花这样的动画效果,开发中有两种方案,一种是直接让设计师给出一个gif图片,然后写入到布局 ...

  4. 【动画消消乐】纯CSS加载/过渡动画学习笔记合集(1-50)

    Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 自我介绍一下 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入 ...

  5. html5游戏加载动画,HTML5 战场3游戏的加载指示动画

    CSS 语言: CSSSCSS 确定 @import "http://battlelog.battlefield.com/cdnprefix/local/public/base/fonts/ ...

  6. ios 旋转加载gif_加载GIF动画方法 iOS

    方法一 使用UIWebView _codeStr为gif网址      如果是本地的gif可以直接使用dataWithContentsOfFile方法 NSData *data = [NSData d ...

  7. Glide加载gif动画只播放一次的方法 Glide加载gif动画先显示最后一帧再开始播放动画导致闪屏的解决方案

    场景: Android App利用ViewPager制作引导页,然后利用Glide加载gif动画. 问题: 1.Glide加载gif动画如何只播放一次? 2.Glide加载gif动画,在viewPag ...

  8. android菊花动画,Android实现仿iOS菊花加载圈动画效果

    常见的实现方式 切图,做旋转动画 自定义View,绘制效果 gif图 1.切图会增加体积,但相对简单,不过在换肤的场景下,会使用不同颜色,需要准备多张图,不够灵活. 2.由于自定义的好处,不同颜色只需 ...

  9. android刷新时的圆形动画_Android自定义加载圈动画效果

    本文实例为大家分享了Android自定义加载圈动画展示的具体代码,供大家参考,具体内容如下 实现如下效果: 该效果图主要有3个动画: 1.旋转动画 2.聚合动画 3.扩散动画 以上3个动画都是通过Va ...

最新文章

  1. HDU 1026 Ignatius and the Princess I(BFS)
  2. JavaWeb学习总结(十二)--事务
  3. Org设置让DataLoader导入数据时能导入创建日期
  4. 在ubuntu14.04中安装搜狗输入法
  5. java se 定时任务_Java实现定时任务的三种方法
  6. 在matlab中求协方差,matlab里面的求协方差函数
  7. [流体输配管网] 使用 Matlab 绘制莫迪图
  8. 2021-06-29提交表单事件
  9. div+css实现背景透明
  10. 会计计算机论文,关于计算机论文格式模板,关于电算化会计相关论文范文资料...
  11. 针对Linux学习,值得阅读的五本书籍,不看可能错失机会
  12. JavaEE | 集合之HashMap与ConcurrentHashMap(看完多线程后补充)
  13. 计算机专业野外考察,野外考察--生存技能
  14. 奋斗(2)第16集剧情介绍
  15. 如何用 Python 实现 QQ 消息自动回复?
  16. python练手小程序—调整图片分辨率(大小)
  17. 设计模式---单例模式Singleton
  18. 异常:getInputStream() has already been called for this request
  19. 《大数据架构和算法实现之路:电商系统的技术实战》——2.4 案例实践
  20. 微信网页分享给朋友或朋友圈只有url链接

热门文章

  1. Mysql的事务事务的特征事务的隔离级别
  2. 埃拉托斯特尼筛法(埃筛)
  3. java不使用IDE导入json
  4. 2020-10-29(Android 的DEX ,ODEX,ELF )
  5. 【web安全】你的open_basedir安全吗?
  6. 设计模式C++实现(10)——桥接模式
  7. 14、MySQL位运算符
  8. 3、MySQL查看或显示数据库(SHOW DATABASES语句)
  9. 1.8 深入解析new运算符
  10. 2018 年 ACM-ICPC 焦作站现场赛感受