Skip to content

Commit 3259c34

Browse files
committed
Merge pull request #20 from dabing1022/master
add ball rotate chase animation
2 parents d008493 + 089e3f1 commit 3259c34

File tree

4 files changed

+69
-2
lines changed

4 files changed

+69
-2
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//
2+
// NVActivityIndicatorAnimationBallRotateChase.swift
3+
// NVActivityIndicatorViewDemo
4+
//
5+
// Created by ChildhoodAndy on 15/12/7.
6+
// Copyright © 2015年 Nguyen Vinh. All rights reserved.
7+
//
8+
9+
import UIKit
10+
11+
class NVActivityIndicatorAnimationBallRotateChase: NVActivityIndicatorAnimationDelegate {
12+
13+
func setUpAnimationInLayer(layer: CALayer, size: CGSize, color: UIColor) {
14+
let circleSize = size.width / 5;
15+
16+
// Draw circles
17+
for var i = 0; i < 5; i++ {
18+
let factor = Float(i) * 1.0 / 5
19+
let circle = NVActivityIndicatorShape.Circle.createLayerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
20+
21+
let animation = rotateAnimation(factor, x: layer.bounds.size.width / 2, y: layer.bounds.size.height / 2, size: size)
22+
circle.addAnimation(animation, forKey: "animation")
23+
layer.addSublayer(circle)
24+
}
25+
}
26+
27+
func rotateAnimation(rate: Float, x: CGFloat, y: CGFloat, size: CGSize) -> CAAnimationGroup {
28+
let duration: CFTimeInterval = 1.5
29+
let fromScale = 1 - rate
30+
let toScale = 0.2 + rate
31+
let timeFunc = CAMediaTimingFunction(controlPoints: 0.5, 0.15 + rate, 0.25, 1.0)
32+
33+
// Scale animation
34+
let scaleAnimation = CABasicAnimation(keyPath: "transform.scale")
35+
scaleAnimation.duration = duration
36+
scaleAnimation.repeatCount = HUGE
37+
scaleAnimation.fromValue = fromScale
38+
scaleAnimation.toValue = toScale
39+
40+
// Position animation
41+
let positionAnimation = CAKeyframeAnimation(keyPath: "position")
42+
positionAnimation.duration = duration
43+
positionAnimation.repeatCount = HUGE
44+
positionAnimation.path = UIBezierPath(arcCenter: CGPoint(x: x, y: y), radius: size.width / 2, startAngle: 3 * CGFloat(M_PI) * 0.5, endAngle: 3 * CGFloat(M_PI) * 0.5 + 2 * CGFloat(M_PI), clockwise: true).CGPath
45+
46+
// Aniamtion
47+
let animation = CAAnimationGroup()
48+
animation.animations = [scaleAnimation, positionAnimation]
49+
animation.timingFunction = timeFunc
50+
animation.duration = duration
51+
animation.repeatCount = HUGE
52+
animation.removedOnCompletion = false
53+
54+
return animation
55+
}
56+
}
57+

NVActivityIndicatorView/NVActivityIndicatorView.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public enum NVActivityIndicatorType {
3838
case Pacman
3939
case BallGridBeat
4040
case SemiCircleSpin
41+
case BallRotateChase
4142

4243
private func animation() -> NVActivityIndicatorAnimationDelegate {
4344
switch self {
@@ -99,6 +100,8 @@ public enum NVActivityIndicatorType {
99100
return NVActivityIndicatorAnimationBallGridBeat()
100101
case .SemiCircleSpin:
101102
return NVActivityIndicatorAnimationSemiCircleSpin()
103+
case .BallRotateChase:
104+
return NVActivityIndicatorAnimationBallRotateChase()
102105
}
103106
}
104107
}

NVActivityIndicatorViewDemo.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@
7878
90A879C61BA557B1001C8989 /* NVActivityIndicatorAnimationSemiCircleSpin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90A879831BA55798001C8989 /* NVActivityIndicatorAnimationSemiCircleSpin.swift */; };
7979
90A879C71BA557B1001C8989 /* NVActivityIndicatorAnimationSquareSpin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90A879841BA55798001C8989 /* NVActivityIndicatorAnimationSquareSpin.swift */; };
8080
90A879C81BA557B1001C8989 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90A879851BA55798001C8989 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift */; };
81+
BD1452341C15810200B952C8 /* NVActivityIndicatorAnimationBallRotateChase.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD1452331C15810200B952C8 /* NVActivityIndicatorAnimationBallRotateChase.swift */; };
82+
BD1452351C1586F200B952C8 /* NVActivityIndicatorAnimationBallRotateChase.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD1452331C15810200B952C8 /* NVActivityIndicatorAnimationBallRotateChase.swift */; };
8183
/* End PBXBuildFile section */
8284

8385
/* Begin PBXContainerItemProxy section */
@@ -136,6 +138,7 @@
136138
90A879861BA55798001C8989 /* NVActivityIndicatorAnimationDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationDelegate.swift; sourceTree = "<group>"; };
137139
90A879871BA55798001C8989 /* NVActivityIndicatorShape.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorShape.swift; sourceTree = "<group>"; };
138140
90A879881BA55798001C8989 /* NVActivityIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorView.swift; sourceTree = "<group>"; };
141+
BD1452331C15810200B952C8 /* NVActivityIndicatorAnimationBallRotateChase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallRotateChase.swift; sourceTree = "<group>"; };
139142
/* End PBXFileReference section */
140143

141144
/* Begin PBXFrameworksBuildPhase section */
@@ -274,6 +277,7 @@
274277
90A879831BA55798001C8989 /* NVActivityIndicatorAnimationSemiCircleSpin.swift */,
275278
90A879841BA55798001C8989 /* NVActivityIndicatorAnimationSquareSpin.swift */,
276279
90A879851BA55798001C8989 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift */,
280+
BD1452331C15810200B952C8 /* NVActivityIndicatorAnimationBallRotateChase.swift */,
277281
);
278282
path = Animations;
279283
sourceTree = "<group>";
@@ -447,6 +451,7 @@
447451
90A879BD1BA557B1001C8989 /* NVActivityIndicatorAnimationBallZigZagDeflect.swift in Sources */,
448452
90A879B51BA557B1001C8989 /* NVActivityIndicatorAnimationBallRotate.swift in Sources */,
449453
90A879B31BA557B1001C8989 /* NVActivityIndicatorAnimationBallPulseRise.swift in Sources */,
454+
BD1452351C1586F200B952C8 /* NVActivityIndicatorAnimationBallRotateChase.swift in Sources */,
450455
90A879C71BA557B1001C8989 /* NVActivityIndicatorAnimationSquareSpin.swift in Sources */,
451456
90A879AE1BA557B1001C8989 /* NVActivityIndicatorAnimationBallClipRotateMultiple.swift in Sources */,
452457
90A879AF1BA557B1001C8989 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift in Sources */,
@@ -488,6 +493,7 @@
488493
90A8798C1BA55798001C8989 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift in Sources */,
489494
90A879A51BA55798001C8989 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift in Sources */,
490495
90A879921BA55798001C8989 /* NVActivityIndicatorAnimationBallRotate.swift in Sources */,
496+
BD1452341C15810200B952C8 /* NVActivityIndicatorAnimationBallRotateChase.swift in Sources */,
491497
90A879941BA55798001C8989 /* NVActivityIndicatorAnimationBallScaleMultiple.swift in Sources */,
492498
90A879A11BA55798001C8989 /* NVActivityIndicatorAnimationLineSpinFadeLoader.swift in Sources */,
493499
90A879981BA55798001C8989 /* NVActivityIndicatorAnimationBallTrianglePath.swift in Sources */,

NVActivityIndicatorViewDemo/ViewController.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,10 @@ class ViewController: UIViewController {
4343
.TriangleSkewSpin,
4444
.Pacman,
4545
.BallGridBeat,
46-
.SemiCircleSpin]
46+
.SemiCircleSpin,
47+
.BallRotateChase]
4748
let cols = 4
48-
let rows = 7
49+
let rows = 8
4950
let cellWidth = Int(self.view.frame.width / CGFloat(cols))
5051
let cellHeight = Int(self.view.frame.height / CGFloat(rows))
5152

0 commit comments

Comments
 (0)