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. 【Unity】稍微说一下关于各种坐标的转换。比如WorldToScreenPoint

    之前写了一篇关于在物体头顶上显示名字的随笔. 估计难懂的点就在各种坐标的转换. 这里详细(就我这水平,怎么可能详细~~~)解说一下.额............. 用另一种方式举个栗子吧. 还是实现在物 ...

  2. 猎鹰9火箭(Falcon 9)

    翻译自:https://www.spacex.com/falcon9 使用了有道词典的翻译,以及本人的修正. 猎鹰9号是SpaceX公司设计和制造的两级火箭,用于可靠和安全地将卫星和“龙”号宇宙飞船送 ...

  3. 2-10 就业课(2.0)-oozie:6、通过oozie执行mr任务,以及执行sqoop任务的解决思路

    执行sqoop任务的解决思路(目前的问题是sqoop只安装在node03上,而oozie会随机分配一个节点来执行任务): ======================================= ...

  4. springCloud 之 Eureka服务治理

    服务治理是微服务架构中最核心和基础的模块 首先我们创建一个springCloud eureka service的springboot 工程,该工程提供一个服务中心,用来注册服务,第二个工程是clien ...

  5. GoJS最简单的实例

    复制如下内容保存到空白的.html文件中,用浏览器打开即可查看效果 <!DOCTYPE html> <html> <head> <meta charset=& ...

  6. R 《回归分析与线性统计模型》page120,4.3

    #P120习题4.3 rm(list = ls()) A = read.xlsx("xiti_4.xlsx",sheet = 3) names(A) = c("ord&q ...

  7. 019、MySQL取本季度开始时间和本季度结束时间

    SELECT QUARTER ( adddate( dy, ) ) QTR, date_add( dy, INTERVAL MONTH ) Q_start, adddate( dy, ) Q_end ...

  8. [题解] LuoguP2764 最小路径覆盖问题

    传送门 好久没做网络流方面的题发现自己啥都不会了qwq 题意:给一张有向图,让你用最少的简单路径覆盖所有的点. 考虑这样一个东西,刚开始,我们有\(n\)条路径,每条路径就是单一的一个点,那么我们的目 ...

  9. getchar、scanf以及缓冲区的概念

      1.getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了.       getch()和getche( ...

  10. Linux系统sda变sdb的解决

    起因 我的电脑有一个128G的固态以及一个500G的机械,我将系统安装在128G固态中,于是将500G的机械(/dev/sdb)挂在在/home目录下,安装完系统后执行lsblk命令 NAME MAJ ...