CAShapeLayer的贝塞尔路径动画

@IBOutlet weak var loadingView: UIView!

    let ovalShapeLayer: CAShapeLayer = CAShapeLayer()

    

    @IBOutlet weak var complexLoadingView: UIView!


    let anotherOvalShapeLayer: CAShapeLayer = CAShapeLayer()

    

    override func viewDidLoad() {

        super.viewDidLoad()

        

    }

    

    override func viewWillAppear(animated: Bool) {

        super.viewWillAppear(animated)

        loadAnimation1()

        beginSimpleAnimation()

        

        loadAnimation2()

        beginComplexAnimation()

    }

    

    func loadAnimation1() {

        ovalShapeLayer.strokeColor = UIColor.purpleColor().CGColor

        ovalShapeLayer.fillColor = UIColor.clearColor().CGColor

        ovalShapeLayer.lineWidth = 7

        

        let ovalRadius           = loadingView.frame.size.height / 2 * 0.8

        ovalShapeLayer.path      = UIBezierPath(ovalInRect: CGRect(

            x: loadingView.frame.size.width / 2 - ovalRadius,

            y: loadingView.frame.height / 2 - ovalRadius,

            width: ovalRadius * 2,

            height: ovalRadius*2)).CGPath

        

//这里设置描边终点是0.4(正好画%40的圆弧)        

        ovalShapeLayer.strokeEnd = 0.4

        ovalShapeLayer.lineCap   = kCALineCapRound

        loadingView.layer.addSublayer(ovalShapeLayer)

    }

    

    

    func beginSimpleAnimation() {

//这里是针对整个layer做的旋转动画

        let rotate = CABasicAnimation(keyPath: "transform.rotation")

        rotate.duration = 1.5

        rotate.fromValue = 0

        rotate.toValue = 2 * M_PI

        rotate.repeatCount = HUGE

        loadingView.layer.addAnimation(rotate, forKey: nil)

    }


    

    func loadAnimation2() {

// 这里没有设置描边终点strokEnd所以就是整个圆都画出来

        anotherOvalShapeLayer.strokeColor = UIColor.whiteColor().CGColor

        anotherOvalShapeLayer.fillColor = UIColor.clearColor().CGColor

        anotherOvalShapeLayer.lineWidth = 7

        

        let anotherOvalRadius      = complexLoadingView.frame.size.height / 2 * 0.8

        anotherOvalShapeLayer.path = UIBezierPath(ovalInRect: CGRect(x: complexLoadingView.frame.size.width / 2 - anotherOvalRadius, y: complexLoadingView.frame.size.height / 2 - anotherOvalRadius, width: 2 * anotherOvalRadius, height: 2 * anotherOvalRadius)).CGPath

        complexLoadingView.layer.addSublayer(anotherOvalShapeLayer)

    }



    

    

    func beginComplexAnimation() {

//这里可以分别针对layer的描边起点和描边终点做动画,

然后组合起来使得layer可以做一个组合动画

        let strokeStartAnimation = CABasicAnimation(keyPath: "strokeStart")

        strokeStartAnimation.fromValue = -0.5

        strokeStartAnimation.toValue = 1

        

        //

        let strokeEndAnimation = CABasicAnimation(keyPath: "strokeEnd")

        strokeEndAnimation.fromValue = 0.0

        strokeEndAnimation.toValue = 1

        

        //

        let strokeAnimationGroup = CAAnimationGroup()

        strokeAnimationGroup.duration = 1.5

        strokeAnimationGroup.repeatCount = HUGE

        

        strokeAnimationGroup.animations = [strokeStartAnimation, strokeEndAnimation]

        anotherOvalShapeLayer.addAnimation(strokeAnimationGroup, forKey: nil)

    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值