Swift CAShapeLayer 和 贝塞尔曲线 实现圆环进度条动画,显示圆形转化成矩形

 

 

 

import UIKit

 

class ViewController: UIViewController {

    var timer :Timer!

    var shapeLayer:CAShapeLayer!

    override func viewDidLoad() {

        super.viewDidLoad()

        

        CircleAnimate()

        rectTransToCircle()

    }

    

    //圆形进度条动画

    func CircleAnimate(){

        shapeLayer = CAShapeLayer()

        self.view.layer.addSublayer(shapeLayer)

        //使用贝塞尔曲线画一个圆形

        let onePath = UIBezierPath(arcCenter: CGPoint(x:300,y:150), radius: 100, startAngle: 0, endAngle: CGFloat(Double.pi*2), clockwise: true)

        //CAShapeLayer 的路径

        shapeLayer.path = onePath.cgPath

        //描线的线宽

        shapeLayer.lineWidth = 30

        //描线起始点

        shapeLayer.strokeStart = 0

        //描线终点

        shapeLayer.strokeEnd = 0

        //填充色

        shapeLayer.fillColor = UIColor.clear.cgColor

        timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(animate), userInfo: nil, repeats: true)

    }

    //定时器

    @objc func animate(){

        shapeLayer.strokeColor = UIColor.blue.cgColor

        if  shapeLayer.strokeEnd < 1{

            self.shapeLayer.strokeEnd += 0.2

        }else{

            timer.invalidate()

        }

    }

    

    //矩形转换成圆形

    func rectTransToCircle(){

        let secondShapeLayer = CAShapeLayer()

        self.view.layer.addSublayer(secondShapeLayer)

        let circlePath = UIBezierPath(arcCenter: CGPoint(x:200,y:500), radius: 200, startAngle: 0, endAngle: CGFloat(Double.pi*2), clockwise: true)

        //使用贝塞尔曲线画一个矩形

        let rectPath = UIBezierPath()

        rectPath.move(to: CGPoint(x: 100, y: 100))

        rectPath.addLine(to: CGPoint(x: 100, y: 150))

        rectPath.addLine(to: CGPoint(x: 150, y: 150))

        rectPath.addLine(to: CGPoint(x: 150, y: 100))

        rectPath.addLine(to: CGPoint(x: 100, y: 100))

 

        //添加路径动画

        let basicAnimate = CABasicAnimation(keyPath: "path")

        basicAnimate.fromValue = circlePath.cgPath

        basicAnimate.toValue = rectPath.cgPath

        basicAnimate.duration = 2

        basicAnimate.repeatCount = 1

        basicAnimate.isRemovedOnCompletion = false

        //CAShapeLayer添加动画

        secondShapeLayer.path = rectPath.cgPath

        secondShapeLayer.add(basicAnimate, forKey: "shape")

    }

    

    

 

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

 

 

}

 

posted @ 2017-11-21 19:42  小炮陈  阅读(3546)  评论(0编辑  收藏  举报