├── .swift-version
├── ALThreeCircleSpinner.sketch
├── Example
├── Supporting Files
│ ├── Images.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── icon@87.png
│ │ │ ├── icon@120.png
│ │ │ ├── icon@180.png
│ │ │ └── Contents.json
│ │ └── LaunchImage.launchimage
│ │ │ ├── splash-4.png
│ │ │ ├── splash-3.5.png
│ │ │ ├── splash-4.7.png
│ │ │ ├── splash-5.5.png
│ │ │ └── Contents.json
│ └── Info.plist
├── AppDelegate.swift
└── ViewController.swift
├── ALThreeCircleSpinner.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
├── xcshareddata
│ └── xcschemes
│ │ └── Example.xcscheme
└── project.pbxproj
├── ALThreeCircleSpinner.podspec
├── .gitignore
├── ALThreeCircleSpinnerTests
├── Supporting Files
│ └── Info.plist
└── ALThreeCircleSpinnerTests.swift
├── README.md
├── LICENSE
└── ALThreeCircleSpinner
└── ALThreeCircleSpinner.swift
/.swift-version:
--------------------------------------------------------------------------------
1 | 3.0
2 |
--------------------------------------------------------------------------------
/ALThreeCircleSpinner.sketch:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AlexLittlejohn/ALThreeCircleSpinner/HEAD/ALThreeCircleSpinner.sketch
--------------------------------------------------------------------------------
/Example/Supporting Files/Images.xcassets/AppIcon.appiconset/icon@87.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AlexLittlejohn/ALThreeCircleSpinner/HEAD/Example/Supporting Files/Images.xcassets/AppIcon.appiconset/icon@87.png
--------------------------------------------------------------------------------
/Example/Supporting Files/Images.xcassets/AppIcon.appiconset/icon@120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AlexLittlejohn/ALThreeCircleSpinner/HEAD/Example/Supporting Files/Images.xcassets/AppIcon.appiconset/icon@120.png
--------------------------------------------------------------------------------
/Example/Supporting Files/Images.xcassets/AppIcon.appiconset/icon@180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AlexLittlejohn/ALThreeCircleSpinner/HEAD/Example/Supporting Files/Images.xcassets/AppIcon.appiconset/icon@180.png
--------------------------------------------------------------------------------
/Example/Supporting Files/Images.xcassets/LaunchImage.launchimage/splash-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AlexLittlejohn/ALThreeCircleSpinner/HEAD/Example/Supporting Files/Images.xcassets/LaunchImage.launchimage/splash-4.png
--------------------------------------------------------------------------------
/Example/Supporting Files/Images.xcassets/LaunchImage.launchimage/splash-3.5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AlexLittlejohn/ALThreeCircleSpinner/HEAD/Example/Supporting Files/Images.xcassets/LaunchImage.launchimage/splash-3.5.png
--------------------------------------------------------------------------------
/Example/Supporting Files/Images.xcassets/LaunchImage.launchimage/splash-4.7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AlexLittlejohn/ALThreeCircleSpinner/HEAD/Example/Supporting Files/Images.xcassets/LaunchImage.launchimage/splash-4.7.png
--------------------------------------------------------------------------------
/Example/Supporting Files/Images.xcassets/LaunchImage.launchimage/splash-5.5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AlexLittlejohn/ALThreeCircleSpinner/HEAD/Example/Supporting Files/Images.xcassets/LaunchImage.launchimage/splash-5.5.png
--------------------------------------------------------------------------------
/ALThreeCircleSpinner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ALThreeCircleSpinner.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |spec|
2 | spec.name = "ALThreeCircleSpinner"
3 | spec.version = "1.0.4"
4 | spec.summary = "A pulsing spinner view written in swift"
5 | spec.source = { :git => "https://github.com/AlexLittlejohn/ALThreeCircleSpinner.git", :tag => spec.version.to_s }
6 | spec.requires_arc = true
7 | spec.platform = :ios, "8.0"
8 | spec.license = "MIT"
9 | spec.source_files = "ALThreeCircleSpinner/*.{swift}"
10 | spec.homepage = "https://github.com/AlexLittlejohn/ALThreeCircleSpinner"
11 | spec.author = { "Alex Littlejohn" => "alexlittlejohn@me.com" }
12 | end
13 |
--------------------------------------------------------------------------------
/Example/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // ALThreeCircleSpinner
4 | //
5 | // Created by Alex Littlejohn on 2015/05/04.
6 | // Copyright (c) 2015 zero. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 | var window: UIWindow?
15 |
16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
17 |
18 | window = UIWindow(frame: UIScreen.main.bounds)
19 | window?.rootViewController = ViewController()
20 | window?.makeKeyAndVisible()
21 |
22 | return true
23 | }
24 | }
25 |
26 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | build/
4 | *.pbxuser
5 | !default.pbxuser
6 | *.mode1v3
7 | !default.mode1v3
8 | *.mode2v3
9 | !default.mode2v3
10 | *.perspectivev3
11 | !default.perspectivev3
12 | xcuserdata
13 | *.xccheckout
14 | *.moved-aside
15 | DerivedData
16 | *.hmap
17 | *.ipa
18 | *.xcuserstate
19 |
20 | # CocoaPods
21 | #
22 | # We recommend against adding the Pods directory to your .gitignore. However
23 | # you should judge for yourself, the pros and cons are mentioned at:
24 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
25 | #
26 | # Pods/
27 |
28 | # Carthage
29 | #
30 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
31 | # Carthage/Checkouts
32 |
33 | Carthage/Build
34 |
35 | /.DS_Store
36 |
--------------------------------------------------------------------------------
/ALThreeCircleSpinnerTests/Supporting Files/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Example/Supporting Files/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "29x29",
6 | "scale" : "2x"
7 | },
8 | {
9 | "size" : "29x29",
10 | "idiom" : "iphone",
11 | "filename" : "icon@87.png",
12 | "scale" : "3x"
13 | },
14 | {
15 | "idiom" : "iphone",
16 | "size" : "40x40",
17 | "scale" : "2x"
18 | },
19 | {
20 | "size" : "40x40",
21 | "idiom" : "iphone",
22 | "filename" : "icon@120.png",
23 | "scale" : "3x"
24 | },
25 | {
26 | "idiom" : "iphone",
27 | "size" : "60x60",
28 | "scale" : "2x"
29 | },
30 | {
31 | "size" : "60x60",
32 | "idiom" : "iphone",
33 | "filename" : "icon@180.png",
34 | "scale" : "3x"
35 | }
36 | ],
37 | "info" : {
38 | "version" : 1,
39 | "author" : "xcode"
40 | }
41 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ⚠️ This project is unmaintained
2 |
3 | # ALThreeCircleSpinner
4 | A pulsing spinner view written in swift
5 |
6 | 
7 |
8 | ### Usage
9 |
10 | ```swift
11 |
12 | // Create your spinner
13 |
14 | let spinner = ALThreeCircleSpinner(frame: CGRectMake(0,0,44,44))
15 |
16 | addSubview(spinner)
17 |
18 | // And thats it, the spinner will start automagically
19 |
20 | ```
21 |
22 | To stop the spinner after its started
23 |
24 | ```swift
25 | spinner.stopAnimating()
26 | ```
27 |
28 | To start it again
29 |
30 | ```swift
31 | spinner.startAnimating()
32 | ```
33 |
34 | You can control the color of the spinner using the `color` property and you can set it to stay visible when animation is stopped using the `hidesWhenStopped` property
35 |
36 | ## Attribution
37 | This spinner is based on the work in the [SpinKit](https://github.com/raymondjavaxx/SpinKit-ObjC) project
38 |
39 |
40 | ## License
41 | ALThreeCircleSpinner is available under the MIT license. See the LICENSE file for more info.
42 |
--------------------------------------------------------------------------------
/ALThreeCircleSpinnerTests/ALThreeCircleSpinnerTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ALThreeCircleSpinnerTests.swift
3 | // ALThreeCircleSpinnerTests
4 | //
5 | // Created by Alex Littlejohn on 2015/05/04.
6 | // Copyright (c) 2015 zero. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import XCTest
11 |
12 | class ALThreeCircleSpinnerTests: XCTestCase {
13 |
14 | override func setUp() {
15 | super.setUp()
16 | // Put setup code here. This method is called before the invocation of each test method in the class.
17 | }
18 |
19 | override func tearDown() {
20 | // Put teardown code here. This method is called after the invocation of each test method in the class.
21 | super.tearDown()
22 | }
23 |
24 | func testExample() {
25 | // This is an example of a functional test case.
26 | XCTAssert(true, "Pass")
27 | }
28 |
29 | func testPerformanceExample() {
30 | // This is an example of a performance test case.
31 | self.measure() {
32 | // Put the code you want to measure the time of here.
33 | }
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Alex Littlejohn
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/Example/Supporting Files/Images.xcassets/LaunchImage.launchimage/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "extent" : "full-screen",
5 | "idiom" : "iphone",
6 | "subtype" : "736h",
7 | "filename" : "splash-5.5.png",
8 | "minimum-system-version" : "8.0",
9 | "orientation" : "portrait",
10 | "scale" : "3x"
11 | },
12 | {
13 | "extent" : "full-screen",
14 | "idiom" : "iphone",
15 | "subtype" : "667h",
16 | "filename" : "splash-4.7.png",
17 | "minimum-system-version" : "8.0",
18 | "orientation" : "portrait",
19 | "scale" : "2x"
20 | },
21 | {
22 | "orientation" : "portrait",
23 | "idiom" : "iphone",
24 | "extent" : "full-screen",
25 | "minimum-system-version" : "7.0",
26 | "filename" : "splash-3.5.png",
27 | "scale" : "2x"
28 | },
29 | {
30 | "extent" : "full-screen",
31 | "idiom" : "iphone",
32 | "subtype" : "retina4",
33 | "filename" : "splash-4.png",
34 | "minimum-system-version" : "7.0",
35 | "orientation" : "portrait",
36 | "scale" : "2x"
37 | }
38 | ],
39 | "info" : {
40 | "version" : 1,
41 | "author" : "xcode"
42 | }
43 | }
--------------------------------------------------------------------------------
/Example/Supporting Files/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 | LSRequiresIPhoneOS
24 |
25 | UIRequiredDeviceCapabilities
26 |
27 | armv7
28 |
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/Example/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // ALThreeCircleSpinner
4 | //
5 | // Created by Alex Littlejohn on 2015/05/04.
6 | // Copyright (c) 2015 zero. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class ViewController: UIViewController {
12 |
13 | let spinner = ALThreeCircleSpinner(frame: CGRect(x: 0, y: 0, width: 44, height: 44))
14 |
15 |
16 | // example stuff
17 | let toggleLabel = UILabel()
18 | let toggle = UISwitch()
19 |
20 | override func viewDidLoad() {
21 | super.viewDidLoad()
22 |
23 | view.addSubview(spinner)
24 | spinner.tintColor = UIColor.red
25 | spinner.hidesWhenStopped = false
26 |
27 |
28 | // example stuff
29 | view.backgroundColor = UIColor.groupTableViewBackground
30 | view.addSubview(toggleLabel)
31 | view.addSubview(toggle)
32 |
33 | toggleLabel.text = "Is Animating"
34 | toggle.setOn(true, animated: false)
35 | toggle.addTarget(self, action: #selector(valueChanged(_:)), for: UIControlEvents.valueChanged)
36 | }
37 |
38 | override func viewWillLayoutSubviews() {
39 | super.viewWillLayoutSubviews()
40 |
41 | spinner.center = view.center
42 |
43 |
44 | // example stuff
45 | toggleLabel.sizeToFit()
46 | toggle.sizeToFit()
47 |
48 | let spacing: CGFloat = 20
49 | let toggleSize = toggle.frame.size
50 | let labelSize = toggleLabel.frame.size
51 |
52 | let labelX = view.frame.size.width/2 - (labelSize.width + spacing + toggleSize.width)/2
53 | let toggleX = labelX + labelSize.width + spacing
54 |
55 | let labelY = view.frame.size.height - 100
56 | let toggleY = labelY + (labelSize.height/2 - toggleSize.height/2)
57 |
58 | toggleLabel.frame = CGRect(x: labelX, y: labelY, width: labelSize.width, height: labelSize.height)
59 | toggle.frame = CGRect(x: toggleX, y: toggleY, width: toggleSize.width, height: toggleSize.height)
60 | }
61 |
62 | func valueChanged(_ sender: UISwitch) {
63 | if toggle.isOn {
64 | spinner.startAnimating()
65 | } else {
66 | spinner.stopAnimating()
67 | }
68 | }
69 | }
70 |
71 |
--------------------------------------------------------------------------------
/ALThreeCircleSpinner.xcodeproj/xcshareddata/xcschemes/Example.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
42 |
43 |
49 |
50 |
51 |
52 |
53 |
54 |
64 |
66 |
72 |
73 |
74 |
75 |
76 |
77 |
83 |
85 |
91 |
92 |
93 |
94 |
96 |
97 |
100 |
101 |
102 |
--------------------------------------------------------------------------------
/ALThreeCircleSpinner/ALThreeCircleSpinner.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ALThreeCircleSpinner.swift
3 | // ALThreeCircleSpinner
4 | //
5 | // Created by Alex Littlejohn on 2015/05/04.
6 | // Copyright (c) 2015 zero. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | open class ALThreeCircleSpinner: UIView {
12 |
13 | fileprivate var stopped: Bool = false
14 |
15 | /// true if the loader should be hidden when it is not animating, default = true
16 | open var hidesWhenStopped: Bool = true
17 |
18 | /// The color of the loader view
19 | override open var tintColor: UIColor! {
20 | didSet {
21 | if let _ = tintColor {
22 | for sublayer in layer.sublayers! {
23 | let _sublayer = sublayer
24 |
25 | _sublayer.backgroundColor = tintColor.cgColor
26 | }
27 | }
28 | }
29 | }
30 |
31 | override public init(frame: CGRect) {
32 | super.init(frame: frame)
33 |
34 | setupAnimation(layer, size: frame.size, color: tintColor)
35 | }
36 |
37 | required public init?(coder aDecoder: NSCoder) {
38 | super.init(coder: aDecoder)
39 |
40 | setupAnimation(layer, size: frame.size, color: tintColor)
41 | }
42 |
43 | /**
44 | * Start animating the loader view
45 | */
46 | open func startAnimating() {
47 | if !isAnimating() {
48 | stopped = false
49 | isHidden = false
50 | resumeLayers()
51 | }
52 | }
53 |
54 | /**
55 | * Stop animating the loader view
56 | * if hidesWhenStopped = true then the loader will be hidden as well
57 | */
58 | open func stopAnimating() {
59 | if isAnimating() {
60 | if hidesWhenStopped {
61 | isHidden = true
62 | }
63 | stopped = true
64 | pauseLayers()
65 | }
66 | }
67 |
68 | /**
69 | * returns true if the loader is animating
70 | */
71 | open func isAnimating() -> Bool {
72 | return !stopped
73 | }
74 |
75 | fileprivate func resumeLayers() {
76 | let pausedTime = layer.timeOffset
77 | let timeSincePause = layer.convertTime(CACurrentMediaTime(), from: nil) - pausedTime
78 |
79 | layer.speed = 1.0;
80 | layer.timeOffset = 0.0;
81 | layer.beginTime = 0.0;
82 | layer.beginTime = timeSincePause;
83 | }
84 |
85 | fileprivate func pauseLayers() {
86 | let pausedTime = layer.convertTime(CACurrentMediaTime(), from: nil)
87 |
88 | layer.speed = 0.0;
89 | layer.timeOffset = pausedTime;
90 | }
91 |
92 | fileprivate func setupAnimation(_ layer: CALayer, size: CGSize, color: UIColor) {
93 | let beginTime = CACurrentMediaTime();
94 |
95 | let offset: CGFloat = size.width / 8;
96 | let circleSize: CGFloat = offset * 2;
97 |
98 | for i in 0..<3 {
99 |
100 | let circleX = CGFloat(i) * 3 * offset
101 | let circleY = size.height / 2 - circleSize/2
102 |
103 | let circle = CALayer();
104 | circle.frame = CGRect(x: circleX, y: circleY, width: circleSize, height: circleSize);
105 | circle.backgroundColor = color.cgColor;
106 | circle.anchorPoint = CGPoint(x: 0.5, y: 0.5);
107 | circle.cornerRadius = circle.bounds.height * 0.5;
108 | circle.transform = CATransform3DMakeScale(0.0, 0.0, 0.0);
109 |
110 | let anim = CAKeyframeAnimation(keyPath: "transform");
111 | anim.isRemovedOnCompletion = false;
112 | anim.repeatCount = Float.infinity;
113 | anim.duration = 1.5;
114 | anim.beginTime = beginTime + CFTimeInterval(0.25 * CGFloat(i));
115 | anim.keyTimes = [0.0, 0.5, 1.0];
116 |
117 | anim.timingFunctions = [
118 | CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut),
119 | CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut),
120 | CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
121 | ];
122 |
123 | anim.values = [
124 | NSValue(caTransform3D:CATransform3DMakeScale(0.0, 0.0, 0.0)),
125 | NSValue(caTransform3D:CATransform3DMakeScale(1.0, 1.0, 0.0)),
126 | NSValue(caTransform3D:CATransform3DMakeScale(0.0, 0.0, 0.0))
127 | ];
128 |
129 | layer.addSublayer(circle)
130 | circle.add(anim, forKey: "anime")
131 | }
132 | }
133 | }
134 |
--------------------------------------------------------------------------------
/ALThreeCircleSpinner.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | FA503D5B1AF76B7500E5C20B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA503D5A1AF76B7500E5C20B /* AppDelegate.swift */; };
11 | FA503D5D1AF76B7500E5C20B /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA503D5C1AF76B7500E5C20B /* ViewController.swift */; };
12 | FA503D621AF76B7500E5C20B /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FA503D611AF76B7500E5C20B /* Images.xcassets */; };
13 | FA503D711AF76B7500E5C20B /* ALThreeCircleSpinnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA503D701AF76B7500E5C20B /* ALThreeCircleSpinnerTests.swift */; };
14 | FA503D7C1AF76BC100E5C20B /* ALThreeCircleSpinner.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA503D7B1AF76BC100E5C20B /* ALThreeCircleSpinner.swift */; };
15 | /* End PBXBuildFile section */
16 |
17 | /* Begin PBXContainerItemProxy section */
18 | FA503D6B1AF76B7500E5C20B /* PBXContainerItemProxy */ = {
19 | isa = PBXContainerItemProxy;
20 | containerPortal = FA503D4D1AF76B7500E5C20B /* Project object */;
21 | proxyType = 1;
22 | remoteGlobalIDString = FA503D541AF76B7500E5C20B;
23 | remoteInfo = ALThreeCircleSpinner;
24 | };
25 | /* End PBXContainerItemProxy section */
26 |
27 | /* Begin PBXFileReference section */
28 | FA503D551AF76B7500E5C20B /* ALThreeCircleSpinner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ALThreeCircleSpinner.app; sourceTree = BUILT_PRODUCTS_DIR; };
29 | FA503D591AF76B7500E5C20B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
30 | FA503D5A1AF76B7500E5C20B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
31 | FA503D5C1AF76B7500E5C20B /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
32 | FA503D611AF76B7500E5C20B /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
33 | FA503D6A1AF76B7500E5C20B /* ALThreeCircleSpinnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ALThreeCircleSpinnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
34 | FA503D6F1AF76B7500E5C20B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
35 | FA503D701AF76B7500E5C20B /* ALThreeCircleSpinnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ALThreeCircleSpinnerTests.swift; sourceTree = ""; };
36 | FA503D7B1AF76BC100E5C20B /* ALThreeCircleSpinner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ALThreeCircleSpinner.swift; sourceTree = ""; };
37 | /* End PBXFileReference section */
38 |
39 | /* Begin PBXFrameworksBuildPhase section */
40 | FA503D521AF76B7500E5C20B /* Frameworks */ = {
41 | isa = PBXFrameworksBuildPhase;
42 | buildActionMask = 2147483647;
43 | files = (
44 | );
45 | runOnlyForDeploymentPostprocessing = 0;
46 | };
47 | FA503D671AF76B7500E5C20B /* Frameworks */ = {
48 | isa = PBXFrameworksBuildPhase;
49 | buildActionMask = 2147483647;
50 | files = (
51 | );
52 | runOnlyForDeploymentPostprocessing = 0;
53 | };
54 | /* End PBXFrameworksBuildPhase section */
55 |
56 | /* Begin PBXGroup section */
57 | FA503D4C1AF76B7500E5C20B = {
58 | isa = PBXGroup;
59 | children = (
60 | FA503D7A1AF76B8100E5C20B /* Example */,
61 | FA503D571AF76B7500E5C20B /* ALThreeCircleSpinner */,
62 | FA503D6D1AF76B7500E5C20B /* ALThreeCircleSpinnerTests */,
63 | FA503D561AF76B7500E5C20B /* Products */,
64 | );
65 | sourceTree = "";
66 | };
67 | FA503D561AF76B7500E5C20B /* Products */ = {
68 | isa = PBXGroup;
69 | children = (
70 | FA503D551AF76B7500E5C20B /* ALThreeCircleSpinner.app */,
71 | FA503D6A1AF76B7500E5C20B /* ALThreeCircleSpinnerTests.xctest */,
72 | );
73 | name = Products;
74 | sourceTree = "";
75 | };
76 | FA503D571AF76B7500E5C20B /* ALThreeCircleSpinner */ = {
77 | isa = PBXGroup;
78 | children = (
79 | FA503D7B1AF76BC100E5C20B /* ALThreeCircleSpinner.swift */,
80 | );
81 | path = ALThreeCircleSpinner;
82 | sourceTree = "";
83 | };
84 | FA503D581AF76B7500E5C20B /* Supporting Files */ = {
85 | isa = PBXGroup;
86 | children = (
87 | FA503D611AF76B7500E5C20B /* Images.xcassets */,
88 | FA503D591AF76B7500E5C20B /* Info.plist */,
89 | );
90 | path = "Supporting Files";
91 | sourceTree = "";
92 | };
93 | FA503D6D1AF76B7500E5C20B /* ALThreeCircleSpinnerTests */ = {
94 | isa = PBXGroup;
95 | children = (
96 | FA503D701AF76B7500E5C20B /* ALThreeCircleSpinnerTests.swift */,
97 | FA503D6E1AF76B7500E5C20B /* Supporting Files */,
98 | );
99 | path = ALThreeCircleSpinnerTests;
100 | sourceTree = "";
101 | };
102 | FA503D6E1AF76B7500E5C20B /* Supporting Files */ = {
103 | isa = PBXGroup;
104 | children = (
105 | FA503D6F1AF76B7500E5C20B /* Info.plist */,
106 | );
107 | path = "Supporting Files";
108 | sourceTree = "";
109 | };
110 | FA503D7A1AF76B8100E5C20B /* Example */ = {
111 | isa = PBXGroup;
112 | children = (
113 | FA503D5A1AF76B7500E5C20B /* AppDelegate.swift */,
114 | FA503D5C1AF76B7500E5C20B /* ViewController.swift */,
115 | FA503D581AF76B7500E5C20B /* Supporting Files */,
116 | );
117 | path = Example;
118 | sourceTree = "";
119 | };
120 | /* End PBXGroup section */
121 |
122 | /* Begin PBXNativeTarget section */
123 | FA503D541AF76B7500E5C20B /* ALThreeCircleSpinner */ = {
124 | isa = PBXNativeTarget;
125 | buildConfigurationList = FA503D741AF76B7500E5C20B /* Build configuration list for PBXNativeTarget "ALThreeCircleSpinner" */;
126 | buildPhases = (
127 | FA503D511AF76B7500E5C20B /* Sources */,
128 | FA503D521AF76B7500E5C20B /* Frameworks */,
129 | FA503D531AF76B7500E5C20B /* Resources */,
130 | );
131 | buildRules = (
132 | );
133 | dependencies = (
134 | );
135 | name = ALThreeCircleSpinner;
136 | productName = ALThreeCircleSpinner;
137 | productReference = FA503D551AF76B7500E5C20B /* ALThreeCircleSpinner.app */;
138 | productType = "com.apple.product-type.application";
139 | };
140 | FA503D691AF76B7500E5C20B /* ALThreeCircleSpinnerTests */ = {
141 | isa = PBXNativeTarget;
142 | buildConfigurationList = FA503D771AF76B7500E5C20B /* Build configuration list for PBXNativeTarget "ALThreeCircleSpinnerTests" */;
143 | buildPhases = (
144 | FA503D661AF76B7500E5C20B /* Sources */,
145 | FA503D671AF76B7500E5C20B /* Frameworks */,
146 | FA503D681AF76B7500E5C20B /* Resources */,
147 | );
148 | buildRules = (
149 | );
150 | dependencies = (
151 | FA503D6C1AF76B7500E5C20B /* PBXTargetDependency */,
152 | );
153 | name = ALThreeCircleSpinnerTests;
154 | productName = ALThreeCircleSpinnerTests;
155 | productReference = FA503D6A1AF76B7500E5C20B /* ALThreeCircleSpinnerTests.xctest */;
156 | productType = "com.apple.product-type.bundle.unit-test";
157 | };
158 | /* End PBXNativeTarget section */
159 |
160 | /* Begin PBXProject section */
161 | FA503D4D1AF76B7500E5C20B /* Project object */ = {
162 | isa = PBXProject;
163 | attributes = {
164 | LastSwiftMigration = 0700;
165 | LastSwiftUpdateCheck = 0700;
166 | LastUpgradeCheck = 0800;
167 | ORGANIZATIONNAME = zero;
168 | TargetAttributes = {
169 | FA503D541AF76B7500E5C20B = {
170 | CreatedOnToolsVersion = 6.3.1;
171 | LastSwiftMigration = 0800;
172 | };
173 | FA503D691AF76B7500E5C20B = {
174 | CreatedOnToolsVersion = 6.3.1;
175 | LastSwiftMigration = 0800;
176 | TestTargetID = FA503D541AF76B7500E5C20B;
177 | };
178 | };
179 | };
180 | buildConfigurationList = FA503D501AF76B7500E5C20B /* Build configuration list for PBXProject "ALThreeCircleSpinner" */;
181 | compatibilityVersion = "Xcode 3.2";
182 | developmentRegion = English;
183 | hasScannedForEncodings = 0;
184 | knownRegions = (
185 | en,
186 | Base,
187 | );
188 | mainGroup = FA503D4C1AF76B7500E5C20B;
189 | productRefGroup = FA503D561AF76B7500E5C20B /* Products */;
190 | projectDirPath = "";
191 | projectRoot = "";
192 | targets = (
193 | FA503D541AF76B7500E5C20B /* ALThreeCircleSpinner */,
194 | FA503D691AF76B7500E5C20B /* ALThreeCircleSpinnerTests */,
195 | );
196 | };
197 | /* End PBXProject section */
198 |
199 | /* Begin PBXResourcesBuildPhase section */
200 | FA503D531AF76B7500E5C20B /* Resources */ = {
201 | isa = PBXResourcesBuildPhase;
202 | buildActionMask = 2147483647;
203 | files = (
204 | FA503D621AF76B7500E5C20B /* Images.xcassets in Resources */,
205 | );
206 | runOnlyForDeploymentPostprocessing = 0;
207 | };
208 | FA503D681AF76B7500E5C20B /* Resources */ = {
209 | isa = PBXResourcesBuildPhase;
210 | buildActionMask = 2147483647;
211 | files = (
212 | );
213 | runOnlyForDeploymentPostprocessing = 0;
214 | };
215 | /* End PBXResourcesBuildPhase section */
216 |
217 | /* Begin PBXSourcesBuildPhase section */
218 | FA503D511AF76B7500E5C20B /* Sources */ = {
219 | isa = PBXSourcesBuildPhase;
220 | buildActionMask = 2147483647;
221 | files = (
222 | FA503D7C1AF76BC100E5C20B /* ALThreeCircleSpinner.swift in Sources */,
223 | FA503D5D1AF76B7500E5C20B /* ViewController.swift in Sources */,
224 | FA503D5B1AF76B7500E5C20B /* AppDelegate.swift in Sources */,
225 | );
226 | runOnlyForDeploymentPostprocessing = 0;
227 | };
228 | FA503D661AF76B7500E5C20B /* Sources */ = {
229 | isa = PBXSourcesBuildPhase;
230 | buildActionMask = 2147483647;
231 | files = (
232 | FA503D711AF76B7500E5C20B /* ALThreeCircleSpinnerTests.swift in Sources */,
233 | );
234 | runOnlyForDeploymentPostprocessing = 0;
235 | };
236 | /* End PBXSourcesBuildPhase section */
237 |
238 | /* Begin PBXTargetDependency section */
239 | FA503D6C1AF76B7500E5C20B /* PBXTargetDependency */ = {
240 | isa = PBXTargetDependency;
241 | target = FA503D541AF76B7500E5C20B /* ALThreeCircleSpinner */;
242 | targetProxy = FA503D6B1AF76B7500E5C20B /* PBXContainerItemProxy */;
243 | };
244 | /* End PBXTargetDependency section */
245 |
246 | /* Begin XCBuildConfiguration section */
247 | FA503D721AF76B7500E5C20B /* Debug */ = {
248 | isa = XCBuildConfiguration;
249 | buildSettings = {
250 | ALWAYS_SEARCH_USER_PATHS = NO;
251 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
252 | CLANG_CXX_LIBRARY = "libc++";
253 | CLANG_ENABLE_MODULES = YES;
254 | CLANG_ENABLE_OBJC_ARC = YES;
255 | CLANG_WARN_BOOL_CONVERSION = YES;
256 | CLANG_WARN_CONSTANT_CONVERSION = YES;
257 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
258 | CLANG_WARN_EMPTY_BODY = YES;
259 | CLANG_WARN_ENUM_CONVERSION = YES;
260 | CLANG_WARN_INFINITE_RECURSION = YES;
261 | CLANG_WARN_INT_CONVERSION = YES;
262 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
263 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
264 | CLANG_WARN_UNREACHABLE_CODE = YES;
265 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
266 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
267 | COPY_PHASE_STRIP = NO;
268 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
269 | ENABLE_STRICT_OBJC_MSGSEND = YES;
270 | ENABLE_TESTABILITY = YES;
271 | GCC_C_LANGUAGE_STANDARD = gnu99;
272 | GCC_DYNAMIC_NO_PIC = NO;
273 | GCC_NO_COMMON_BLOCKS = YES;
274 | GCC_OPTIMIZATION_LEVEL = 0;
275 | GCC_PREPROCESSOR_DEFINITIONS = (
276 | "DEBUG=1",
277 | "$(inherited)",
278 | );
279 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
280 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
281 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
282 | GCC_WARN_UNDECLARED_SELECTOR = YES;
283 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
284 | GCC_WARN_UNUSED_FUNCTION = YES;
285 | GCC_WARN_UNUSED_VARIABLE = YES;
286 | IPHONEOS_DEPLOYMENT_TARGET = 8.3;
287 | MTL_ENABLE_DEBUG_INFO = YES;
288 | ONLY_ACTIVE_ARCH = YES;
289 | SDKROOT = iphoneos;
290 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
291 | TARGETED_DEVICE_FAMILY = "1,2";
292 | };
293 | name = Debug;
294 | };
295 | FA503D731AF76B7500E5C20B /* Release */ = {
296 | isa = XCBuildConfiguration;
297 | buildSettings = {
298 | ALWAYS_SEARCH_USER_PATHS = NO;
299 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
300 | CLANG_CXX_LIBRARY = "libc++";
301 | CLANG_ENABLE_MODULES = YES;
302 | CLANG_ENABLE_OBJC_ARC = YES;
303 | CLANG_WARN_BOOL_CONVERSION = YES;
304 | CLANG_WARN_CONSTANT_CONVERSION = YES;
305 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
306 | CLANG_WARN_EMPTY_BODY = YES;
307 | CLANG_WARN_ENUM_CONVERSION = YES;
308 | CLANG_WARN_INFINITE_RECURSION = YES;
309 | CLANG_WARN_INT_CONVERSION = YES;
310 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
311 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
312 | CLANG_WARN_UNREACHABLE_CODE = YES;
313 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
314 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
315 | COPY_PHASE_STRIP = NO;
316 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
317 | ENABLE_NS_ASSERTIONS = NO;
318 | ENABLE_STRICT_OBJC_MSGSEND = YES;
319 | GCC_C_LANGUAGE_STANDARD = gnu99;
320 | GCC_NO_COMMON_BLOCKS = YES;
321 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
322 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
323 | GCC_WARN_UNDECLARED_SELECTOR = YES;
324 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
325 | GCC_WARN_UNUSED_FUNCTION = YES;
326 | GCC_WARN_UNUSED_VARIABLE = YES;
327 | IPHONEOS_DEPLOYMENT_TARGET = 8.3;
328 | MTL_ENABLE_DEBUG_INFO = NO;
329 | SDKROOT = iphoneos;
330 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
331 | TARGETED_DEVICE_FAMILY = "1,2";
332 | VALIDATE_PRODUCT = YES;
333 | };
334 | name = Release;
335 | };
336 | FA503D751AF76B7500E5C20B /* Debug */ = {
337 | isa = XCBuildConfiguration;
338 | buildSettings = {
339 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
340 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
341 | INFOPLIST_FILE = "Example/Supporting Files/Info.plist";
342 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
343 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
344 | PRODUCT_BUNDLE_IDENTIFIER = "com.zero.$(PRODUCT_NAME:rfc1034identifier)";
345 | PRODUCT_NAME = "$(TARGET_NAME)";
346 | SWIFT_VERSION = 3.0;
347 | TARGETED_DEVICE_FAMILY = 1;
348 | };
349 | name = Debug;
350 | };
351 | FA503D761AF76B7500E5C20B /* Release */ = {
352 | isa = XCBuildConfiguration;
353 | buildSettings = {
354 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
355 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
356 | INFOPLIST_FILE = "Example/Supporting Files/Info.plist";
357 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
358 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
359 | PRODUCT_BUNDLE_IDENTIFIER = "com.zero.$(PRODUCT_NAME:rfc1034identifier)";
360 | PRODUCT_NAME = "$(TARGET_NAME)";
361 | SWIFT_VERSION = 3.0;
362 | TARGETED_DEVICE_FAMILY = 1;
363 | };
364 | name = Release;
365 | };
366 | FA503D781AF76B7500E5C20B /* Debug */ = {
367 | isa = XCBuildConfiguration;
368 | buildSettings = {
369 | BUNDLE_LOADER = "$(TEST_HOST)";
370 | FRAMEWORK_SEARCH_PATHS = (
371 | "$(SDKROOT)/Developer/Library/Frameworks",
372 | "$(inherited)",
373 | );
374 | GCC_PREPROCESSOR_DEFINITIONS = (
375 | "DEBUG=1",
376 | "$(inherited)",
377 | );
378 | INFOPLIST_FILE = "ALThreeCircleSpinnerTests/Supporting Files/Info.plist";
379 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
380 | PRODUCT_BUNDLE_IDENTIFIER = "com.zero.$(PRODUCT_NAME:rfc1034identifier)";
381 | PRODUCT_NAME = "$(TARGET_NAME)";
382 | SWIFT_VERSION = 3.0;
383 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ALThreeCircleSpinner.app/ALThreeCircleSpinner";
384 | };
385 | name = Debug;
386 | };
387 | FA503D791AF76B7500E5C20B /* Release */ = {
388 | isa = XCBuildConfiguration;
389 | buildSettings = {
390 | BUNDLE_LOADER = "$(TEST_HOST)";
391 | FRAMEWORK_SEARCH_PATHS = (
392 | "$(SDKROOT)/Developer/Library/Frameworks",
393 | "$(inherited)",
394 | );
395 | INFOPLIST_FILE = "ALThreeCircleSpinnerTests/Supporting Files/Info.plist";
396 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
397 | PRODUCT_BUNDLE_IDENTIFIER = "com.zero.$(PRODUCT_NAME:rfc1034identifier)";
398 | PRODUCT_NAME = "$(TARGET_NAME)";
399 | SWIFT_VERSION = 3.0;
400 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ALThreeCircleSpinner.app/ALThreeCircleSpinner";
401 | };
402 | name = Release;
403 | };
404 | /* End XCBuildConfiguration section */
405 |
406 | /* Begin XCConfigurationList section */
407 | FA503D501AF76B7500E5C20B /* Build configuration list for PBXProject "ALThreeCircleSpinner" */ = {
408 | isa = XCConfigurationList;
409 | buildConfigurations = (
410 | FA503D721AF76B7500E5C20B /* Debug */,
411 | FA503D731AF76B7500E5C20B /* Release */,
412 | );
413 | defaultConfigurationIsVisible = 0;
414 | defaultConfigurationName = Release;
415 | };
416 | FA503D741AF76B7500E5C20B /* Build configuration list for PBXNativeTarget "ALThreeCircleSpinner" */ = {
417 | isa = XCConfigurationList;
418 | buildConfigurations = (
419 | FA503D751AF76B7500E5C20B /* Debug */,
420 | FA503D761AF76B7500E5C20B /* Release */,
421 | );
422 | defaultConfigurationIsVisible = 0;
423 | defaultConfigurationName = Release;
424 | };
425 | FA503D771AF76B7500E5C20B /* Build configuration list for PBXNativeTarget "ALThreeCircleSpinnerTests" */ = {
426 | isa = XCConfigurationList;
427 | buildConfigurations = (
428 | FA503D781AF76B7500E5C20B /* Debug */,
429 | FA503D791AF76B7500E5C20B /* Release */,
430 | );
431 | defaultConfigurationIsVisible = 0;
432 | defaultConfigurationName = Release;
433 | };
434 | /* End XCConfigurationList section */
435 | };
436 | rootObject = FA503D4D1AF76B7500E5C20B /* Project object */;
437 | }
438 |
--------------------------------------------------------------------------------