import UIKit

class CVLayerView: UIView {

var pulseLayer : CAShapeLayer!  //定义图层

override init(frame: CGRect) {

super.init(frame: frame)

let width = self.bounds.size.width

// 动画图层

pulseLayer = CAShapeLayer()

pulseLayer.bounds = CGRect(x: 0, y: 0, width: width, height: width)

pulseLayer.position = CGPoint(x: width/2, y: width/2)

pulseLayer.backgroundColor = UIColor.clear.cgColor

// 用BezierPath画一个原型

pulseLayer.path = UIBezierPath(ovalIn: pulseLayer.bounds).cgPath

// 脉冲效果的颜色  (注释*1)

pulseLayer.fillColor = UIColor.init(r: 213, g: 54, b: 13).cgColor

pulseLayer.opacity = 0.0

// 关键代码

let replicatorLayer = CAReplicatorLayer()

replicatorLayer.bounds = CGRect(x: 0, y: 0, width: width, height: width)

replicatorLayer.position = CGPoint(x: width/2, y: width/2)

replicatorLayer.instanceCount = 3  // 三个复制图层

replicatorLayer.instanceDelay = 1  // 频率

replicatorLayer.addSublayer(pulseLayer)

self.layer.addSublayer(replicatorLayer)

self.layer.insertSublayer(replicatorLayer, at: 0)

}

func starAnimation() {

// 透明

let opacityAnimation = CABasicAnimation(keyPath: "opacity")

opacityAnimation.fromValue = 1.0  // 起始值

opacityAnimation.toValue = 0     // 结束值

// 扩散动画

let scaleAnimation = CABasicAnimation(keyPath: "transform")

let t = CATransform3DIdentity

scaleAnimation.fromValue = NSValue(caTransform3D: CATransform3DScale(t, 0.0, 0.0, 0.0))

scaleAnimation.toValue = NSValue(caTransform3D: CATransform3DScale(t, 1.0, 1.0, 0.0))

// 给CAShapeLayer添加组合动画

let groupAnimation = CAAnimationGroup()

groupAnimation.animations = [opacityAnimation,scaleAnimation]

groupAnimation.duration = 3   //持续时间

groupAnimation.autoreverses = false //循环效果

groupAnimation.repeatCount = HUGE

groupAnimation.isRemovedOnCompletion = false

pulseLayer.add(groupAnimation, forKey: nil)

}

required init?(coder aDecoder: NSCoder) {

super.init(coder: aDecoder)

}

}

使用方法

let waveView = CVLayerView(frame: CGRect(x: margin*CGFloat(index)*2+margin/2, y: 10, width: margin, height: margin))

waveView.center = button.center

// 因为我的VC是XIB  所以将图层添加在到按钮之下 一般用法就直接addSubview就可以了

//                self.insertSubview(waveView, belowSubview: button)

self.addSubview(waveView)

waveView.starAnimation()  // 开始动画

swift之水纹动画的更多相关文章

  1. Swift - transform.m34动画示例

    Swift - transform.m34动画示例 效果 源码 https://github.com/YouXianMing/Swift-Animations // // CATransform3DM ...

  2. Swift 表视图动画教程: Drop-In Cards

    http://www.raywenderlich.com/76024/swift-table-view-animations-tutorial-drop-cards 标准 table view 是一个 ...

  3. swift - 歌曲列表动画

    // //  ViewController.swift //  songAnimation // //  Created by su on 15/12/10. //  Copyright © 2015 ...

  4. iOS开发——动画篇Swift篇&常用动画总结

    UIView动画: UIView动画时最基本的动画,是直接对我们界面上控件进行简单的动画效果实现,如果你只需要用到一些简单的效果,那么这个很适合你,关于UIView动画实现恨简单, UIKit直接将动 ...

  5. swift 之SnapKit 动画

    这个问题纠结了我挺长时间的.一直以为把约束直接添加到动画里面就可以了.但是并没那么简单.-.-其实还是挺简 class ViewController: UIViewController { @IBOu ...

  6. swift 头尾式动画

    1.0 头尾式动画 UIView.beginAnimations(nil, context: nil) UIView.setAnimationDuration(1.0) // 设置执行动画所需要的时间 ...

  7. swift 设置图片动画组 iOS11之前 默认图片 设置不成功

    在iOS 11 上, 1.先执行动画组 在设置图片执行帧动画,2.先设置图片在设置帧动画,执行帧动画  没有任何问题 在iOS 10和iOS9上,必须 执行 方法二(先设置图片在设置帧动画,执行帧动画 ...

  8. 你会用swift创建复杂的加载动画吗(1)

    时至今日,iOS 应用商店已经拥有超过了140万 应用,让你自己的应用脱颖而出确实是个不小的挑战.不过,在你的应用掉入默默无闻的大黑洞之前,你拥有一个小小的机遇窗,它能帮你吸引用户的注意. AD: 时 ...

  9. iOS - 开源框架、项目和学习资料汇总(动画篇)

    动画 1. Core Animation笔记,基本的使用方法 – Core Animation笔记,基本的使用方法:1.基本动画,2.多步动画,3.沿路径的动画,4.时间函数,5.动画组.2. awe ...

随机推荐

  1. asp.net获取时间日期插入数据库

    //获取日期+时间 DateTime.Now.ToString(); // 2008-9-4 20:02:10 DateTime.Now.ToLocalTime().ToString(); // 20 ...

  2. js左右选项移动

    <!--网页代码--><div class="modal" id="modal-primary7"> <div class=&qu ...

  3. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 图片:图片响应式 (将很好地扩展到父元素)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. 新闻网大数据实时分析可视化系统项目——17、Spark2.X分布式弹性数据集

    1.三大弹性数据集介绍 1)概念 2)优缺点对比 2.Spark RDD概述与创建方式 1)概述 在集群背后,有一个非常重要的分布式数据架构,即弹性分布式数据集(resilientdistribute ...

  5. iOS 安全地在主线程执行一个Block

    //主线程同步队列 #define dispatch_main_sync_safe(block)\ if ([NSThread isMainThread]) {\ block();\ } else { ...

  6. JS在不改变原数组的情况下复制一个新的数组

    var a={1,2,3,4} var data= JSON.parse(JSON.stringify(a[0])) a.push(data) a[4]=5 这样就不会改变原数组a的数据

  7. 深度学习之常用linux命令总结

    深度学习中常用linux命令总结 1.创建文件夹 mkdir 文件名2.删除文件 rm -d 目录名 #删除一个空目录 rmdir 目录名 #删除一个空目录 rm -r 目录名 #删除一个非空目录 r ...

  8. CSS隐藏商务通等内容

    CSS隐藏商务通等内容<style>#qiao-wrap{display:none !important;} </style>

  9. pythonfile的知识点

    1. file=open("/test/case1.txt","w") #open(路径+文件名,读写模式) #读写模式: r:只读(默认) rb:读二进制文件 ...

  10. Adapter之自定义Adapter

    前言: 在我们写程序是经常会用到适配器,当系统自带的适配器不够用时即可自己定义适配器 正文: 因为我们用到的ListView视图所以我们先初始化ListView,在我们的主活动中添加如下代码 < ...