简单三步实现UIButton水波纹效果——swift

实现思路:

  1. 重写init方法,添加点击事件
        override init(frame: CGRect) {
            super.init(frame: frame)
            self.addTarget(self, action: #selector(self.touchedDown(sender:events:)), for: UIControlEvents.touchUpInside)
        }
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            fatalError("")
        }
  2. 根据点击事件创建点击事件类,放进字典中。
       @objc func touchedDown(sender: LYWaveTouchButton, events: UIEvent) {
            let touch = events.touches(for: sender)?.first
            let point = touch?.location(in: sender)//以button为坐标系
            
            let buttonCircle: LYButtonCircle = LYButtonCircle()//点击事件类
            buttonCircle.circleCenterX = (point?.x)!//圆心
            buttonCircle.circleCenterY = (point?.y)!
            buttonCircle.circleRait = 0.0//初始半径
            //以button中点为基准,判断最大半径值
            let maxX = point!.x > (self.frame.size.width - point!.x) ? point!.x : (self.frame.size.width - point!.x)
            let maxY = point!.y > (self.frame.size.height - point!.y) ? point!.y : (self.frame.size.height - point!.y)
            buttonCircle.circleWidth = maxX > maxY ? maxX : maxY
            circles[circleFlag] = buttonCircle
            
            //为每个点击事件增加一个定时器,每隔0.01s画一个半径不断增大的圆
            Timer.scheduledTimer(timeInterval: TimeInterval(0.01), target: self, selector: #selector(self.timerFunction(timer:)), userInfo: circleFlag, repeats: true)
            
            circleFlag += 1
        }
  3. 每增加一个点击事件就开一个定时器,重复画以点击事件为圆心半径不断增大的圆。直到圆超出button。
        @objc func timerFunction(timer: Timer) {
            self.setNeedsDisplay()//会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了
            let index:Int = timer.userInfo! as! Int
            let buttonCircle: LYButtonCircle = circles[index]!
            //circleRait:半径缩放系数,circleRait若等于1则圆达到最大半径,字典中删除点击事件,结束定时任务
            if buttonCircle.circleRait <= 1 {
                buttonCircle.circleRait += 1.0/CGFloat(self.loopCount)
            } else {
                circles.removeValue(forKey: index)
                timer.invalidate()
            }
        }
        
        override func draw(_ rect: CGRect) {
            let context: CGContext = UIGraphicsGetCurrentContext()!
            let endAngel = CGFloat(Double.pi * 2)
            for buttonCircle: LYButtonCircle in circles.values {
                //画圆
                context.addArc(center: CGPoint(x: buttonCircle.circleCenterX, y: buttonCircle.circleCenterY), radius: buttonCircle.circleRait*buttonCircle.circleWidth, startAngle:0, endAngle: endAngel, clockwise: false)
                self.hightLightColor.withAlphaComponent(1-buttonCircle.circleRait).setStroke()
                self.hightLightColor.withAlphaComponent(1-buttonCircle.circleRait).setFill()
                context.fillPath()
            }
        }

附上代码地址:点击打开链接获取swift代码

猜你喜欢

转载自blog.csdn.net/weixin_42012181/article/details/80077886