layui tree动态加载 利用CAReplicatorLayer实现的加载动画

发布时间:2017-04-12

来源:服务器之家

在上一篇中,笔者简要介绍了CAReplicatorLayer,在本篇中,将介绍具体的实用价值。

实用CAReplicatorLayer作为核心技术实现加载动画。

首先,创建一个UIView的子类

@interface JHHJView : UIView

然后该子类暴露出一些类方法:

/* 显示加载动画 并添加到父视图上 */

+ (void)showLoadingOnView:(UIView *)superView Type:(JHHJViewType)type;

/* 显示动画 并添加在主窗口上 */

+ (void)showLoadingOnTheKeyWindowWithType:(JHHJViewType)type;

/* 停止动画 */

+ (void)hideLoading;

/* 设置动画背景色(全屏背景色) */

+ (void)backgroudColor:(UIColor *)color;

/* 设置中心视图的动画背景颜色 默认透明色 */

+ (void)centerBGViewBackgroudColor:(UIColor *)color;

并且声明了一个枚举类型:该枚举类型代表着加载动画类型。

typedef NS_ENUM(NSInteger,JHHJViewType){

/**

* 线性动画

*/

JHHJViewTypeSingleLine = 0,

/**

* 方形点动画

*/

JHHJViewTypeSquare = 1,

/**

* 三角形运动动画

*/

JHHJViewTypeTriangleTranslate = 2,

/**

* 原型视图裁剪动画

*/

JHHJViewTypeClip

};

在.m文件中,该类拥有的成员变量如下:

@interface JHHJView ()

//中心背景视图

@property (nonatomic,strong)JHHJCenterBGView *centerBGView;

//计时器

@property (nonatomic,strong)NSTimer * clipTimer;

//层数组

@property (nonatomic,strong)NSMutableArray * clipLayerArr;

//计时器计量数

@property (nonatomic,assign) long long currentTimerIndex;

//背景层

@property (nonatomic,strong) CAShapeLayer *bgLayer;

@end

然后,设置以单例的方式创建该类的对象:

/**

* 对象单例化

*

* @return 单例对象

*/

+ (JHHJView *)shareInstanceJHHJView{

static JHHJView * instance = nil;

if (!instance) {

instance = [[JHHJView alloc] initWithFrame:[UIScreen mainScreen].bounds];

instance.centerBGView = [[JHHJCenterBGView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];

instance.centerBGView.center = CGPointMake(K_IOS_WIDTH / 2, K_IOS_HEIGHT/2);

[instance addSubview:instance.centerBGView];

}

return instance;

}

最重要的一点,动画的实现如下:

/**

* 展示动画视图 并添加到依赖视图上

*

* @param superView 依赖的父视图

* @param type 动画样式

*/

+ (void)showLoadingOnView:(UIView *)superView Type:(JHHJViewType)type{

/* 在显示前 先从父视图移除当前动画视图 */

JHHJView *instance = [[self class] shareInstanceJHHJView];

[[self class] hideLoading];

/* 显示前 先将动画图层从中心视图上移除 */

for (CALayer *layer in instance.centerBGView.layer.sublayers) {

[layer removeFromSuperlayer];

}

/* 按照type初始化动画 */

switch (type) {

case JHHJViewTypeSingleLine:

{

CALayer *layer = [instance lineAnimation];

layer.position = CGPointMake(CGRectGetWidth(instance.centerBGView.frame)/2 - 25, CGRectGetHeight(instance.centerBGView.frame)/2);

[instance.centerBGView.layer addSublayer:layer];

}break;

case JHHJViewTypeSquare:

{

CALayer *layer = [[self class] qurareAnimation];

layer.position = CGPointMake(CGRectGetWidth(instance.centerBGView.frame)/2, CGRectGetHeight(instance.centerBGView.frame)/2);

[instance.centerBGView.layer addSublayer:layer];

}break;

case JHHJViewTypeTriangleTranslate:

{

CALayer *layer = [[self class] triangleAnimation];

layer.position = CGPointMake(CGRectGetWidth(instance.centerBGView.frame)/2 - 18, CGRectGetHeight(instance.centerBGView.frame)/2 - 15);

[instance.centerBGView.layer addSublayer:layer];

}break;

case JHHJViewTypeClip:

{

CALayer *layer = [[self class] clipAnimation];

layer.position = CGPointMake(CGRectGetWidth(instance.centerBGView.frame)/2 , CGRectGetHeight(instance.centerBGView.frame)/2 - 15);

[instance.centerBGView.layer addSublayer:layer];

}break;

default:

break;

}

[superView addSubview:instance];

}

具体的流程即是以上,下面来具体实现其中一个动画,以三角形旋转动画为例:

/**

* 三角形运动动画

*

* @return 动画实例对象

*/

+ (CALayer *)triangleAnimation{

/* 基本间距确定及模板层的创建 */

CGFloat radius = 50/4.0;

CGFloat transX = 50 - radius;

CAShapeLayer *shape = [CAShapeLayer layer];

shape.frame = CGRectMake(0, 0, radius, radius);

shape.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, radius, radius)].CGPath;

shape.strokeColor = [UIColor redColor].CGColor;

shape.fillColor = [UIColor redColor].CGColor;

shape.lineWidth = 1;

[shape addAnimation:[JHHJAnimation rotateAnimation] forKey:@"rotateAnimation"];

/* 创建克隆层 */

CAReplicatorLayer *replicatorLayer = [CAReplicatorLayer layer];

replicatorLayer.frame = CGRectMake(0, 0, radius, radius);

replicatorLayer.instanceDelay = 0.0;

replicatorLayer.instanceCount = 3;

CATransform3D trans3D = CATransform3DIdentity;

trans3D = CATransform3DTranslate(trans3D, transX, 0, 0);

trans3D = CATransform3DRotate(trans3D, 120.0*M_PI/180.0, 0.0, 0.0, 1.0);

replicatorLayer.instanceTransform = trans3D;

[replicatorLayer addSublayer:shape];

return replicatorLayer;

}

JHHJAnimation这个类是为了分离代码,而创建的动画创建类,里面使用类方法创建各种核心动画,如:

/**

* 缩小动画

*

*/

+ (CABasicAnimation *)animationForScaleSmall{

CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"transform"];

basic.fromValue = [NSValue valueWithCATransform3D:CATransform3DScale(CATransform3DIdentity, 1, 1, 0)];

basic.toValue = [NSValue valueWithCATransform3D:CATransform3DScale(CATransform3DIdentity, 0.2, 0.2, 0)];

basic.duration = 1.05;

basic.repeatCount = HUGE;

return basic;

}

好了,基本的流程就是这样了,来个效果图:

layui的tree如何实现动态加载_layui tree动态加载 利用CAReplicatorLayer实现的加载动画 - 电脑常识 - 服务器之家...相关推荐

  1. layui的tree如何实现动态加载_layui tree组件如何异步加载数据,动态添加树节点...

    $data = [ [ 'id' => 1, 'name' => '江苏省', 'pid' => 0], [ 'id' => 2, 'name' => '徐州市', 'p ...

  2. layui树形懒加载_layui树形表格支持非异步和异步加载

    layui树形表格支持非异步和异步加载. 使用示例如下: 展开全部 展开一层 折叠全部 折叠一层 layui.config({ base: '/uui/treetable-lay/module/' } ...

  3. 如何让linux加载当前目录的动态库

    debian从7.0开始支持multiarch,64位库的路径改到/usr/lib/x86_64-linux-gnu了,mint.ubuntu这些衍生版有没有跟着改我就不清楚了. deepin lin ...

  4. 【Android 逆向】加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )

    文章目录 一.动态加载 二.第一代加壳技术 ( DEX 整体加固 ) 三.第二代加壳技术 ( 函数抽取 ) 四.第三代加壳技术 ( Java 函数 -> Native 函数 ) 五.so 动态库 ...

  5. 【Android 逆向】Android 进程注入工具开发 ( 远程进程注入动态库文件操作 | 注入动态库 加载 业务动态库 | 业务动态库启动 | pthread_create 线程开发 )

    文章目录 前言 一.加载 libnattive.so 动态库 二. libnattive.so 动态库启动 三. pthread_create 线程开发 四. 线程执行函数 前言 libbridge. ...

  6. 【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )

    文章目录 I . Android Studio 中使用 Android.mk 配置动态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  7. html加载less,javascript – 动态加载less.js规则

    我正在看使用 less. js(看起来不错),但我们的网站要求在初始页面加载后,动态加载一些样式.但是,似乎所有的LESS样式表都必须在less.js脚本加载之前加载.即这样做 但是如果行被交换,则它 ...

  8. php动态页面加载慢,通过动态加载JS文件提升网站访问速度

    相对与HTML,CSS,javascript是最影响浏览器性能的,因为浏览器在遇到<script>标签时,必须等待js代码下载和执行完毕后再执行后面的内容,因此当页面中js文件过多时,网站 ...

  9. layui父页面调用子页面的渲染_layUI ajax加载html页面后重新渲染的方法

    相关问题同: 1.layUI使用jquery.load加载界面时,如何让layui渲染页面? 2.layUI ajax加载html页面后重新渲染 layUI ajax加载html页面后渲染,关键在将h ...

最新文章

  1. 物体计数--Learning To Count Objects in Images
  2. java makedir用法_Java Files.makeDir方法代码示例
  3. python函数定义的要点_python基础之函数重点
  4. Java创建线程的方式
  5. 配置思路ensp_配置OSPF的Stub区域示例
  6. 攻防世界-Misc-_Aesop_secret
  7. 汇编原理实验 --类型统计(字母,数字,其他字符的个数)
  8. android 请求参数打印,Android开发-----关于解决Retrofit打印HttpLog和设置连接超时的问题...
  9. Linux 守护进程创建原理及简易方法
  10. mongoDB对没有字段的记录新增字段
  11. 2017的金秋,派卧底去阿里、京东、美团、滴滴带回来的面试题及答案
  12. 1.GNUradio 的环境搭建
  13. 威廉第三的MAC系列教程(一) ——使用ACPI Patcher制作DSDT补丁
  14. 解决checkra1n越狱失败及越狱后AFC2失效问题
  15. 模拟黑洞图像_CSS filter 模拟黑洞照片效果
  16. 计算机主板 上电顺序,笔记本电脑主板的上电过程
  17. linux蓝屏漏洞,WIN 10漏洞:访问特定本地设备导致系统崩溃
  18. Unity游戏动画 从入门到住院 4:动画状态机
  19. Odoo 16 企业版手册 - 库存管理之库存调拨
  20. Windows控制台基本操作命令

热门文章

  1. python白鹅类型_fluent python 11.10节 鹅的行为有可能像鸭子
  2. vue 大屏滚动实现 利用marquee和element-ui table
  3. MongoDB使用过程中的报错处理(持续更新)
  4. 零基础学习 Python 之前期准备
  5. 关于Mybatis的xml配置文件中使用and与or混合查询
  6. 09: xmltodict 模块将xml格式转成json格式
  7. (转载)虚幻引擎3--【UnrealScript教程】章节一:6.int和float
  8. HNCU1324:算法2-2:有序线性表的有序合并(线性表)
  9. .net 注册引用的dll
  10. 基于FFmpeg接收RTSP的ts流