• 给视图添加点击波纹效果swift5


    给视图添加点击波纹效果

    import UIKit
     
    class ViewController: UIViewController {
        
        private let radarAnimation = "radarAnimation"
        private var animationLayer: CALayer?
        private var animationGroup: CAAnimationGroup?
     
     
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            
            let first = makeRadarAnimation(showRect: CGRect(x: 120, y: 150,  140, height: 140), isRound: true)    //位置和大小
            view.layer.addSublayer(first)
        }
     
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
        //动作-开始
        @IBAction func startAction(_ sender: UIButton) {
            animationLayer?.add(animationGroup!, forKey: radarAnimation)
        }
        //动作-停止
        @IBAction func stopAction(_ sender: UIButton) {
            animationLayer?.removeAnimation(forKey: radarAnimation)
        }
        
        private func makeRadarAnimation(showRect: CGRect, isRound: Bool) -> CALayer {
            // 1. 一个动态波
            let shapeLayer = CAShapeLayer()
            shapeLayer.frame = showRect
            // showRect 最大内切圆
        
            shapeLayer.path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0,  showRect.width, height: showRect.height)).cgPath
            
            shapeLayer.fillColor = UIColor.white.cgColor    //波纹颜色
           
            shapeLayer.opacity = 0.0    // 默认初始颜色透明度
            
            animationLayer = shapeLayer
            
            // 2. 需要重复的动态波,即创建副本
            let replicator = CAReplicatorLayer()
            replicator.frame = shapeLayer.bounds
            replicator.instanceCount = 4
            replicator.instanceDelay = 1.0
            replicator.addSublayer(shapeLayer)
            
            // 3. 创建动画组
            let opacityAnimation = CABasicAnimation(keyPath: "opacity")
            opacityAnimation.fromValue = NSNumber(floatLiteral: 1.0)  // 开始透明度
            opacityAnimation.toValue = NSNumber(floatLiteral: 0)      // 结束时透明底
            
            let scaleAnimation = CABasicAnimation(keyPath: "transform")
            if isRound {
                scaleAnimation.fromValue = NSValue.init(caTransform3D: CATransform3DScale(CATransform3DIdentity, 1.0, 1.0, 0))      // 缩放起始大小
            } else {
                scaleAnimation.fromValue = NSValue.init(caTransform3D: CATransform3DScale(CATransform3DIdentity, 1.5, 1.5, 0))      // 缩放起始大小
            }
            scaleAnimation.toValue = NSValue.init(caTransform3D: CATransform3DScale(CATransform3DIdentity, 2.0, 2.0, 0))      // 缩放结束大小
            
            let animationGroup = CAAnimationGroup()
            animationGroup.animations = [opacityAnimation, scaleAnimation]
            animationGroup.duration = 3.0       // 动画执行时间
            animationGroup.repeatCount = HUGE   // 最大重复
            animationGroup.autoreverses = false
            
            self.animationGroup = animationGroup
            
            shapeLayer.add(animationGroup, forKey: radarAnimation)
            
            return replicator
        }
     
     
    }
  • 相关阅读:
    URLProtocol服务协议
    ODBC、OLEDB和ADO之间的关系 ,以及性能比较
    如何在VS2015查看C#界面窗体里的控件层次
    SpeechVoiceSpeakFlags枚举类型的详细解释
    SQL中遇到多条相同内容只取一条的最简单实现方法
    flink elasticsearch sink table 忽略部分字段开发
    flink elasticsearch source table 集成elasticsearch-hadoop connector开发
    记一次python 协程给合多线程死锁问题
    kubernetes gitlab runner java maven ci/cd 整体方案示例
    某云elasticsearch节点失效,手动重置primary,迁移分区
  • 原文地址:https://www.cnblogs.com/baitongtong/p/13734318.html
Copyright © 2020-2023  润新知