@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)
}