CAReplicatorLayer可以将自己的子图层复制指定的次数,并且复制体会保持被复制图层的各种基础属性以及动画

基本属性

  • instanceCount
    var instanceCount: Int
    拷贝图层的次数,包括其所有的子图层,默认值是1,也就是没有任何子图层被复制
  • instanceDelay
    var instanceDelay: CFTimeInterval
    在短时间内的复制延时,一般用在动画上(支持动画的延时)
  • instanceTransform
    var instanceTransform: CATransform3D
    复制图层在被创建时产生的和上一个复制图层的位移(位移的锚点时CAReplicatorlayer的中心点)
  • preservesDepth
    var preservesDepth: Bool
    如果设置为YES,图层将保持于CATransformLayer类似的性质和相同的限制

  • instanceColor
    var instanceColor: CGColor?
    设置多个复制图层的颜色,默认位白色
  • instanceRedOffset
    var instanceRedOffset: Float
    设置每个复制图层相对上一个复制图层的红色偏移量
  • instanceGreenOffset
    var instanceGreenOffset: Float
    设置每个复制图层相对上一个复制图层的绿色偏移量
  • instanceBlueOffset
    var instanceBlueOffset: Float
    设置每个复制图层相对上一个复制图层的蓝色偏移量
  • instanceAlphaOffset
    var instanceAlphaOffset: Float
    设置每个复制图层相对上一个复制图层的透明度偏移量

实例

首先我们来实现一个类似于雷达的动画,想必大家都见过这样的动画,其实使用复制图层实现起来特别的简单,这是一个比较简单的Demo,大家可以通过给图层设置图片,或者使用上一篇我们提到的CAGradientLayer来实现更加炫酷的动画

CAReplicatorLayer.gif
//
// ViewController.swift
// CAReplicatorLayer
//
// Created by 蔡士林 on 6/17/16.
// Copyright © 2016 BZ. All rights reserved.
// import UIKit class ViewController: UIViewController { var replicatorLayer:CAReplicatorLayer!
let kWidth = UIScreen.mainScreen().bounds.size.width override func viewDidLoad() {
super.viewDidLoad()
setupUI()
} func setupUI() {
let animationView = UIView() // 创建一个背景视图
animationView.bounds = CGRectMake(0, 0, kWidth, 200)
animationView.center = self.view.center
self.view.addSubview(animationView)
animationView.backgroundColor = UIColor.lightGrayColor()
animationView.clipsToBounds = true let animationLayer = CAShapeLayer() 动画图层,就是不停变大的那个圆
animationLayer.backgroundColor = UIColor.redColor().CGColor
animationLayer.bounds = CGRectMake(0, 0, 20, 20)
animationLayer.cornerRadius = 10
animationLayer.position = CGPointMake(kWidth/2, 100) // 放大的动画
let transformAnim = CABasicAnimation(keyPath: "transform")
let value = NSValue.init(CATransform3D: CATransform3DMakeScale(10, 10, 1))
transformAnim.toValue = value
transformAnim.duration = 2 // 透明度动画(其实也可以直接设置CAReplicatorLayer的instanceAlphaOffset来实现)
let alphaAnim = CABasicAnimation(keyPath: "opacity")
alphaAnim.toValue = 0
alphaAnim.duration = 2 let animGroup = CAAnimationGroup()
animGroup.animations = [transformAnim,alphaAnim]
animGroup.duration = 2
animGroup.repeatCount = HUGE
animationLayer.addAnimation(animGroup, forKey: nil) replicatorLayer = CAReplicatorLayer()
replicatorLayer.addSublayer(animationLayer);
replicatorLayer.instanceCount = 3 //三个复制图层
replicatorLayer.instanceDelay = 0.3 // 复制间隔0.3秒
animationView.layer.addSublayer(replicatorLayer)
}
}

接下来介绍几个加载动画的用法~

CAReplicatorLayer_2.gif
//
// ViewController.swift
// CAReplicatorLayer
//
// Created by 蔡士林 on 6/17/16.
// Copyright © 2016 BZ. All rights reserved.
// import UIKit class ViewController: UIViewController { var replicatorLayer:CAReplicatorLayer!
let kWidth = UIScreen.mainScreen().bounds.size.width override func viewDidLoad() {
super.viewDidLoad()
setupUI()
} func setupUI() {
let animationView = UIView()
animationView.bounds = CGRectMake(0, 0, kWidth, 300)
animationView.center = self.view.center
self.view.addSubview(animationView)
animationView.backgroundColor = UIColor.lightGrayColor()
animationView.clipsToBounds = true let animationLayer = CAShapeLayer()
animationLayer.backgroundColor = UIColor.redColor().CGColor
animationLayer.bounds = CGRectMake(0, 0, 20, 20)
animationLayer.anchorPoint = CGPointMake(0.5, 0.5)
animationLayer.position = CGPointMake(0, animationView.center.y)
animationLayer.cornerRadius = 10 let path = CGPathCreateMutable() // 创建转圈的动画
CGPathAddEllipseInRect(path, nil, CGRectMake((animationView.bounds.size.width-160)/2, (animationView.bounds.size.height-160)/2, 160, 160)) let transformAnim = CAKeyframeAnimation(keyPath: "position")
transformAnim.duration = 4
transformAnim.repeatCount = HUGE
transformAnim.path = path animationLayer.addAnimation(transformAnim, forKey: nil) replicatorLayer = CAReplicatorLayer()
replicatorLayer.addSublayer(animationLayer);
replicatorLayer.repeatCount = HUGE
replicatorLayer.instanceCount = 20
replicatorLayer.instanceDelay = 0.2 // 动画延迟
replicatorLayer.instanceAlphaOffset = -0.05 // 透明度递减
animationView.layer.addSublayer(replicatorLayer)
}
}

另一个炫酷的动画,带大小缩放的动画

CAReplicatorLayer_3.gif
//
// ViewController.swift
// CAReplicatorLayer
//
// Created by 蔡士林 on 6/17/16.
// Copyright © 2016 BZ. All rights reserved.
// import UIKit class ViewController: UIViewController { var replicatorLayer:CAReplicatorLayer!
let kWidth = UIScreen.mainScreen().bounds.size.width override func viewDidLoad() {
super.viewDidLoad()
setupUI()
} func setupUI() {
let animationView = UIView()
animationView.bounds = CGRectMake(0, 0, kWidth, 300)
animationView.center = self.view.center
self.view.addSubview(animationView)
animationView.backgroundColor = UIColor.grayColor()
animationView.clipsToBounds = true let animationLayer = CAShapeLayer()
animationLayer.backgroundColor = UIColor.redColor().CGColor
animationLayer.bounds = CGRectMake(0, 0, 20, 20)
animationLayer.position = CGPointMake(self.view.bounds.size.width/2, 50)
animationLayer.borderColor = UIColor.whiteColor().CGColor
animationLayer.cornerRadius = 2
animationLayer.borderWidth = 1
animationLayer.transform = CATransform3DMakeScale(0.1, 0.1, 0.1) let transformAnim = CABasicAnimation(keyPath: "transform")
transformAnim.duration = 2
transformAnim.repeatCount = HUGE
transformAnim.fromValue = NSValue.init(CATransform3D: CATransform3DMakeScale(1, 1, 1))
transformAnim.toValue = NSValue.init(CATransform3D: CATransform3DMakeScale(0.1, 0.1, 0.1)) animationLayer.addAnimation(transformAnim, forKey: nil) replicatorLayer = CAReplicatorLayer()
replicatorLayer.frame = CGRectMake(0, 0, self.view.bounds.size.width, 300)
replicatorLayer.addSublayer(animationLayer);
replicatorLayer.instanceCount = 20
replicatorLayer.instanceDelay = 0.1
let angle = CGFloat(2*M_PI) / CGFloat(20)
replicatorLayer.instanceTransform = CATransform3DMakeRotation(angle, 0, 0, 1.0)
animationView.layer.addSublayer(replicatorLayer)
}
}

我的配色比较渣渣,所以看起来不够酷,但是只要你有心,肯定是酷毙了,其实也可以通过关键帧的动画,实现书写文字啊等更加复杂的动画,以后有时间的话,会继续补充完整~

CAReplicatorLayer 详解的更多相关文章

  1. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  2. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  3. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  6. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  7. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  8. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  9. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

随机推荐

  1. uva 10328 - Coin Toss 投硬币(dp递推,大数)

    题意:抛出n次硬币(有顺序),求至少k个以上的连续正面的情况的种数. 思路:转换成求抛n个硬币,至多k-1个连续的情况种数,用所有可能出现的情况种数减去至多k-1个的情况,就得到答案了.此题涉及大数加 ...

  2. python爬虫之路——对字符串的处理

    对字符串的处理分类:分段,连接,剔除,提取,综合 连接:+,* +(加法)的使用 a='i' b=' love' c=' you' print(a+b+c) #return i love you *( ...

  3. Android内核剖析(1)

    Linux的启动过程 开机上电执行bootloader,将内核的前n条指令加载到系统内存中------>系统内核的初始化----------->启动应用程序. bootloader的位置装 ...

  4. Ruby中访问控制符public,private,protected区别总结

    重点关注private与protected public 默认即为public,全局都可以访问,这个不解释 private C++, “private” 意为 “private to this cla ...

  5. 字符编码ANSI和ASCII区别、Unicode和UTF-8区别

    ANSI码ANSI编码是一种对ASCII码的拓展:ANSI编码用0x00~0x7f (即十进制下的0到127)范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围来表示 ...

  6. 为管理复杂组件状态困扰?试试 vue 简单状态管理 Store 模式【转】

    https://juejin.im/post/5cd50849f265da03a54c3877 在 vue 中,通信有几种形式: 父子组件 emit/on vuex 中共享 state 跨组件 Eve ...

  7. ctrl+shift+f

    ctrl+f是在当前文件寻找某个参数 ctrl+shift+f是在整个工程目录下寻找某个参数

  8. Bootstrap历练实例:大小Well

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  9. 基于Nodejs的爬虫

    简介 基于 Node.JS 爬取 博客园 1W+博文,对博文内容做关键词提取,生成词云. 演示 安装 安装 git.Node.JS.MongoDB.Yarn 克隆代码 git clone git@gi ...

  10. 约束Constraints

    1.setNeedsUpdateConstraints:当想要调整子视图布局时,在主线程调用该方法标记constraint需要在未来的某个点更新(该方法不会立刻强制刷新constraint,而是等待下 ...