├── .gitignore
├── Example
├── Resources
│ ├── scr.png
│ ├── example.gif
│ ├── Assets.xcassets
│ │ └── AppIcon.appiconset
│ │ │ ├── SF_120_Red.png
│ │ │ ├── SF_120_Red_1024.png
│ │ │ └── Contents.json
│ ├── main.m
│ ├── ExampleInfo.plist
│ └── LaunchScreen.storyboard
├── Example.xcodeproj
│ ├── project.xcworkspace
│ │ └── contents.xcworkspacedata
│ ├── xcshareddata
│ │ └── xcschemes
│ │ │ └── Example.xcscheme
│ └── project.pbxproj
└── Source
│ ├── ViewController.h
│ ├── AppDelegate.h
│ ├── AppDelegate.m
│ └── ViewController.m
├── SFProgressCircle.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
├── xcuserdata
│ └── sig.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
├── xcshareddata
│ └── xcschemes
│ │ └── SFProgressCircle.xcscheme
└── project.pbxproj
├── SFProgressCircle.xcworkspace
├── xcshareddata
│ └── WorkspaceSettings.xcsettings
└── contents.xcworkspacedata
├── .travis.yml
├── Source
├── Info.plist
├── SFProgressCircle.h
├── SFCircleGradientLayer.h
├── SFCircleGradientView.h
├── SFCircleGradientView.m
└── SFCircleGradientLayer.m
├── LICENSE
├── SFProgressCircle.podspec
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | *.DS_Store*
2 | *xcuserdata*
3 | *xcshareddata*
4 | /Pods
5 | *.idea*
6 | *.vscode*
--------------------------------------------------------------------------------
/Example/Resources/scr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sfcd/SFProgressCircle/HEAD/Example/Resources/scr.png
--------------------------------------------------------------------------------
/Example/Resources/example.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sfcd/SFProgressCircle/HEAD/Example/Resources/example.gif
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/SF_120_Red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sfcd/SFProgressCircle/HEAD/Example/Resources/Assets.xcassets/AppIcon.appiconset/SF_120_Red.png
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/SF_120_Red_1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sfcd/SFProgressCircle/HEAD/Example/Resources/Assets.xcassets/AppIcon.appiconset/SF_120_Red_1024.png
--------------------------------------------------------------------------------
/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/SFProgressCircle.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/SFProgressCircle.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Example/Source/ViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.h
3 | // Example
4 | //
5 | // Created by Sibagatov Ildar on 21/07/16.
6 | // Copyright © 2016 SFÇD. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface ViewController : UIViewController
12 |
13 | @end
14 |
15 |
--------------------------------------------------------------------------------
/SFProgressCircle.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Example/Source/AppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.h
3 | // Example
4 | //
5 | // Created by Sibagatov Ildar on 21/07/16.
6 | // Copyright © 2016 SFÇD. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface AppDelegate : UIResponder
12 |
13 | @property (strong, nonatomic) UIWindow *window;
14 |
15 | @end
16 |
17 |
--------------------------------------------------------------------------------
/Example/Resources/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // Example
4 | //
5 | // Created by Sibagatov Ildar on 21/07/16.
6 | // Copyright © 2016 SFÇD. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "AppDelegate.h"
11 |
12 | int main(int argc, char * argv[]) {
13 | @autoreleasepool {
14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Example/Source/AppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.m
3 | // Example
4 | //
5 | // Created by Sibagatov Ildar on 21/07/16.
6 | // Copyright © 2016 SFÇD. All rights reserved.
7 | //
8 |
9 | #import "AppDelegate.h"
10 | #import "ViewController.h"
11 |
12 | @implementation AppDelegate
13 |
14 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
15 | _window = [[UIWindow alloc] init];
16 | [_window setRootViewController:[[ViewController alloc] init]];
17 | [_window makeKeyAndVisible];
18 | return YES;
19 | }
20 |
21 | @end
22 |
--------------------------------------------------------------------------------
/SFProgressCircle.xcodeproj/xcuserdata/sig.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | SFProgressCircle.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 1
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | 0B0F7D161D41071500821B00
16 |
17 | primary
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: objective-c
2 | osx_image: xcode9.4
3 | env:
4 | global:
5 | - LC_CTYPE=en_US.UTF-8
6 | - LANG=en_US.UTF-8
7 | - WORKSPACE=SFProgressCircle.xcworkspace
8 | - FRAMEWORK_SCHEME="SFProgressCircle"
9 | - EXAMPLE_SCHEME="Example"
10 | - IOS_SDK=iphonesimulator11.4
11 | - DESTINATION="name=iPhone 8,OS=11.4"
12 | script:
13 | - xcodebuild -version
14 | - xcodebuild -showsdks
15 | - xcodebuild -workspace "$WORKSPACE" -scheme "$FRAMEWORK_SCHEME" -sdk "$IOS_SDK" -destination "$DESTINATION" -configuration Debug ONLY_ACTIVE_ARCH=NO clean build | xcpretty -c
16 | - xcodebuild -workspace "$WORKSPACE" -scheme "$EXAMPLE_SCHEME" -sdk "$IOS_SDK" -destination "$DESTINATION" -configuration Debug ONLY_ACTIVE_ARCH=NO clean build | xcpretty -c
17 |
--------------------------------------------------------------------------------
/Source/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 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(CURRENT_PROJECT_VERSION)
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2018 SFÇD
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 Softwar
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20 | SOFTWARE.
21 |
--------------------------------------------------------------------------------
/Example/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "60x60",
35 | "idiom" : "iphone",
36 | "filename" : "SF_120_Red.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "idiom" : "iphone",
41 | "size" : "60x60",
42 | "scale" : "3x"
43 | },
44 | {
45 | "size" : "1024x1024",
46 | "idiom" : "ios-marketing",
47 | "filename" : "SF_120_Red_1024.png",
48 | "scale" : "1x"
49 | }
50 | ],
51 | "info" : {
52 | "version" : 1,
53 | "author" : "xcode"
54 | }
55 | }
--------------------------------------------------------------------------------
/SFProgressCircle.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |s|
2 | s.name = "SFProgressCircle"
3 | s.version = "1.0.6"
4 | s.summary = "A circular gradient progress view implementation for iOS (supports partial circle)"
5 | s.description = <<-DESC
6 | A circular gradient progress view implementation for iOS (supports partial circle)
7 | * Perfect circular gradient.
8 | * Possibility to set both startColor and endColor.
9 | * Possibility to set both startAngle and endAngle.
10 | * Possibility to set lineWidth.
11 | * Possibility to set progress with or without animation.
12 | DESC
13 | s.homepage = "https://github.com/sfcd/SFProgressCircle.git"
14 | s.screenshots = "https://raw.githubusercontent.com/sfcd/SFProgressCircle/master/Example/Resources/scr.png"
15 | s.license = { :type => "MIT", :file => "LICENSE" }
16 | s.author = { "SFÇD" => "developers@softfacade.com" }
17 | s.source = { :git => "https://github.com/sfcd/SFProgressCircle.git", :tag => s.version }
18 | s.platform = :ios, '8.0'
19 | s.requires_arc = true
20 | s.frameworks = 'UIKit', 'QuartzCore', 'CoreGraphics'
21 | s.source_files = 'Source/*.{h,m}'
22 | end
23 |
--------------------------------------------------------------------------------
/Source/SFProgressCircle.h:
--------------------------------------------------------------------------------
1 | //
2 | // SFProgressCircle.h
3 | //
4 | // The MIT License (MIT)
5 | // Copyright (c) 2016 SFÇD
6 | //
7 | // Permission is hereby granted, free of charge, to any person obtaining a copy
8 | // of this software and associated documentation files (the "Software"), to deal
9 | // in the Software without restriction, including without limitation the rights
10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | // copies of the Software, and to permit persons to whom the Software is
12 | // furnished to do so, subject to the following conditions:
13 | //
14 | // The above copyright notice and this permission notice shall be included in all
15 | // copies or substantial portions of the Software.
16 | //
17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 | // SOFTWARE.
24 | //
25 |
26 | @import UIKit;
27 |
28 | FOUNDATION_EXPORT double SFProgressCircleVersionNumber;
29 | FOUNDATION_EXPORT const unsigned char SFProgressCircleVersionString[];
30 |
31 | #import
32 | #import
--------------------------------------------------------------------------------
/Example/Resources/ExampleInfo.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 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 |
29 | UIRequiredDeviceCapabilities
30 |
31 | armv7
32 |
33 | UIStatusBarHidden
34 |
35 | UIStatusBarStyle
36 | UIStatusBarStyleLightContent
37 | UISupportedInterfaceOrientations
38 |
39 | UIInterfaceOrientationPortrait
40 |
41 | UISupportedInterfaceOrientations~ipad
42 |
43 | UIInterfaceOrientationPortrait
44 | UIInterfaceOrientationPortraitUpsideDown
45 | UIInterfaceOrientationLandscapeLeft
46 | UIInterfaceOrientationLandscapeRight
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/Source/SFCircleGradientLayer.h:
--------------------------------------------------------------------------------
1 | //
2 | // SFCircleGradientLayer.h
3 | //
4 | // The MIT License (MIT)
5 | // Copyright (c) 2016 SFÇD
6 | //
7 | // Permission is hereby granted, free of charge, to any person obtaining a copy
8 | // of this software and associated documentation files (the "Software"), to deal
9 | // in the Software without restriction, including without limitation the rights
10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | // copies of the Software, and to permit persons to whom the Software is
12 | // furnished to do so, subject to the following conditions:
13 | //
14 | // The above copyright notice and this permission notice shall be included in all
15 | // copies or substantial portions of the Software.
16 | //
17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 | // SOFTWARE.
24 | //
25 |
26 | #import
27 | #import
28 |
29 | @interface SFCircleGradientLayer : CALayer
30 |
31 | @property (nonatomic) CGFloat progress;
32 | @property (nonatomic) UIColor *startColor;
33 | @property (nonatomic) UIColor *endColor;
34 | @property (nonatomic) CGFloat startAngle;
35 | @property (nonatomic) CGFloat endAngle;
36 | @property (nonatomic) int numSegments;
37 | @property (nonatomic) CGFloat circleRadius;
38 | @property (nonatomic) CGFloat circleWidth;
39 | @property (nonatomic) BOOL roundedCorners;
40 |
41 | @end
42 |
--------------------------------------------------------------------------------
/Source/SFCircleGradientView.h:
--------------------------------------------------------------------------------
1 | //
2 | // SFCircleGradientView.h
3 | //
4 | // The MIT License (MIT)
5 | // Copyright (c) 2016 SFÇD
6 | //
7 | // Permission is hereby granted, free of charge, to any person obtaining a copy
8 | // of this software and associated documentation files (the "Software"), to deal
9 | // in the Software without restriction, including without limitation the rights
10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | // copies of the Software, and to permit persons to whom the Software is
12 | // furnished to do so, subject to the following conditions:
13 | //
14 | // The above copyright notice and this permission notice shall be included in all
15 | // copies or substantial portions of the Software.
16 | //
17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 | // SOFTWARE.
24 | //
25 |
26 | #import
27 | #import
28 | #import
29 |
30 | IB_DESIGNABLE
31 | @interface SFCircleGradientView : UIView
32 |
33 | @property (nonatomic) IBInspectable CGFloat progress;
34 | @property (nonatomic) IBInspectable CGFloat lineWidth;
35 | @property (nonatomic) IBInspectable UIColor *startColor;
36 | @property (nonatomic) IBInspectable UIColor *endColor;
37 | @property (nonatomic) IBInspectable CGFloat startAngle;
38 | @property (nonatomic) IBInspectable CGFloat endAngle;
39 | @property (nonatomic) IBInspectable BOOL roundedCorners;
40 |
41 | - (void)setProgress:(CGFloat)progress animateWithDuration:(NSTimeInterval)duration;
42 | - (void)abortAnimation;
43 |
44 | @end
45 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # SFProgressCircle
2 |
3 | [](https://travis-ci.org/sfcd/SFProgressCircle)
4 | [](https://img.shields.io/cocoapods/v/SFProgressCircle.svg?style=flat)
5 | [](http://cocoadocs.org/docsets/SFProgressCircle?style=flat)
6 | [](https://twitter.com/sfcdteam?style=flat)
7 |
8 | A circular gradient progress view implementation for iOS with efficient drawing using a series of arcs with linear gradient.
9 |
10 |
11 |
12 | ## Features
13 |
14 | - [x] Perfect circular gradient.
15 | - [x] Possibility to set both ``startColor`` and ``endColor``.
16 | - [x] Possibility to set both ``startAngle`` and ``endAngle``.
17 | - [x] Possibility to set ``lineWidth``.
18 | - [x] Possibility to set ``progress`` with or without animation.
19 | - [x] Rounded edges for progress line.
20 |
21 | ## TODO
22 |
23 | - [ ] Looped circular gradient.
24 | - [ ] Multiple colors for gradient.
25 |
26 | ## Requirements
27 |
28 | - iOS 8.0+
29 | - Xcode 6.3+
30 |
31 | ## Installation
32 | > **Embedded frameworks require a minimum deployment target of iOS 8.**
33 |
34 | ### CocoaPods
35 |
36 | [CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command:
37 |
38 | ```bash
39 | $ gem install cocoapods
40 | ```
41 |
42 | To integrate SFProgressCircle into your Xcode project using CocoaPods, specify it in your `Podfile`:
43 |
44 | ```ruby
45 | source 'https://github.com/CocoaPods/Specs.git'
46 | platform :ios, '8.0'
47 | use_frameworks!
48 |
49 | target '' do
50 | pod 'SFProgressCircle'
51 | end
52 | ```
53 |
54 | Then, run the following command:
55 |
56 | ```bash
57 | $ pod install
58 | ```
59 |
60 | ## Contribution
61 |
62 | Please feel free to ask questions, open issues and submit pull requests.
63 |
64 | ## License
65 |
66 | SFProgressCircle is available under the MIT license. See the LICENSE file for more info.
67 |
--------------------------------------------------------------------------------
/SFProgressCircle.xcodeproj/xcshareddata/xcschemes/SFProgressCircle.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
54 |
55 |
61 |
62 |
63 |
64 |
65 |
66 |
72 |
73 |
79 |
80 |
81 |
82 |
84 |
85 |
88 |
89 |
90 |
--------------------------------------------------------------------------------
/Example/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
54 |
56 |
62 |
63 |
64 |
65 |
66 |
69 |
70 |
71 |
77 |
79 |
85 |
86 |
87 |
88 |
90 |
91 |
94 |
95 |
96 |
--------------------------------------------------------------------------------
/Example/Resources/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
30 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/Example/Source/ViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.m
3 | // Example
4 | //
5 | // Created by Sibagatov Ildar on 21/07/16.
6 | // Copyright © 2016 SFÇD. All rights reserved.
7 | //
8 |
9 | #import "ViewController.h"
10 | #import
11 |
12 | #define AnimationDuration 0.6
13 |
14 | #define BlueColor [UIColor colorWithRed:0.f green:185.f/255.f blue:242.f/255.f alpha:1]
15 | #define PurpleColor [UIColor colorWithRed:151.f/255.f green:88.f/255.f blue:254.f/255.f alpha:1]
16 | #define YellowColor [UIColor colorWithRed:1.f green:234.f/255.f blue:57.f/255.f alpha:1]
17 | #define GreenColor [UIColor colorWithRed:32.f/255.f green:218.f/255.f blue:145.f/255.f alpha:1]
18 |
19 | @interface ViewController ()
20 | {
21 | NSArray *themes;
22 | NSInteger cursor;
23 |
24 | CFTimeInterval startTime;
25 | NSNumber *fromNumber;
26 | NSNumber *toNumber;
27 | }
28 | @property (nonatomic) SFCircleGradientView *progressView;
29 | @property (nonatomic) UILabel *titleLabel;
30 | @property (nonatomic) UIButton *refreshButton;
31 |
32 | @end
33 |
34 | @implementation ViewController
35 |
36 | - (void)viewDidLoad
37 | {
38 | [super viewDidLoad];
39 | self.view.backgroundColor = [UIColor whiteColor];
40 |
41 | _progressView = [[SFCircleGradientView alloc] initWithFrame:(CGRect){0, 0, 240, 240}];
42 | [_progressView setCenter:self.view.center];
43 | [_progressView setLineWidth:6];
44 | [_progressView setProgress:0];
45 | [_progressView setRoundedCorners:YES];
46 | [self.view addSubview:_progressView];
47 |
48 | _titleLabel = [[UILabel alloc] initWithFrame:(CGRect){0, 0, 100, 30}];
49 | [_titleLabel setCenter:self.view.center];
50 | [_titleLabel setFont:[UIFont boldSystemFontOfSize:34]];
51 | [_titleLabel setTextAlignment:NSTextAlignmentCenter];
52 | [self.view addSubview:_titleLabel];
53 |
54 | _refreshButton = [UIButton buttonWithType:UIButtonTypeSystem];
55 | [_refreshButton addTarget:self action:@selector(onRefresh) forControlEvents:UIControlEventTouchUpInside];
56 | [_refreshButton setTitle:@"Refresh" forState:UIControlStateNormal];
57 | [_refreshButton sizeToFit];
58 | [_refreshButton setCenter:(CGPoint) {self.view.center.x, CGRectGetMaxY(_progressView.frame) + 30}];
59 | [self.view addSubview:_refreshButton];
60 |
61 | cursor = -1;
62 | themes = @[ @[GreenColor, YellowColor],
63 | @[GreenColor, PurpleColor],
64 | @[PurpleColor, BlueColor],
65 | @[PurpleColor, YellowColor],
66 | @[BlueColor, YellowColor], ];
67 | }
68 |
69 | - (void)viewDidAppear:(BOOL)animated
70 | {
71 | [super viewDidAppear:animated];
72 | [self onRefresh];
73 | }
74 |
75 | - (UIStatusBarStyle)preferredStatusBarStyle
76 | {
77 | return UIStatusBarStyleDefault;
78 | }
79 |
80 | - (void)onRefresh
81 | {
82 | [_progressView setProgress:0];
83 | _titleLabel.text = @"";
84 |
85 | __weak __typeof(self)weakSelf = self;
86 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
87 | if (weakSelf) {
88 | __strong __typeof(weakSelf)strongSelf = weakSelf;
89 | [strongSelf locateNewTheme];
90 | }
91 | });
92 | }
93 |
94 | - (void)locateNewTheme
95 | {
96 | cursor++;
97 | if (cursor >= themes.count) {
98 | cursor = 0;
99 | }
100 | UIColor *startColor = [themes[cursor] firstObject];
101 | UIColor *endColor = [themes[cursor] lastObject];
102 |
103 | [_progressView setStartColor:startColor];
104 | [_progressView setEndColor:endColor];
105 | [_titleLabel setTextColor:startColor];
106 |
107 | CGFloat from = 0.f;
108 | CGFloat to = 1.f;
109 | [_progressView setProgress:to animateWithDuration:AnimationDuration];
110 | [self animateTitle:@(from) toNumber:@(to * 100)];
111 | }
112 |
113 | - (void)animateTitle:(NSNumber *)from toNumber:(NSNumber *)to
114 | {
115 | fromNumber = from;
116 | toNumber = to;
117 | _titleLabel.text = [fromNumber stringValue];
118 |
119 | CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(animateNumber:)];
120 | startTime = CACurrentMediaTime();
121 | [link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
122 | }
123 |
124 | - (void)animateNumber:(CADisplayLink *)link
125 | {
126 | float dt = ([link timestamp] - startTime) / AnimationDuration;
127 | if (dt >= 1.0) {
128 | _titleLabel.text = [toNumber stringValue];
129 | [link removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
130 | return;
131 | }
132 | float current = ([toNumber floatValue] - [fromNumber floatValue]) * dt + [fromNumber floatValue];
133 | _titleLabel.text = [NSString stringWithFormat:@"%li", (long)current];
134 | }
135 |
136 | @end
137 |
--------------------------------------------------------------------------------
/Source/SFCircleGradientView.m:
--------------------------------------------------------------------------------
1 | //
2 | // SFCircleGradientView.m
3 | //
4 | // The MIT License (MIT)
5 | // Copyright (c) 2016 SFÇD
6 | //
7 | // Permission is hereby granted, free of charge, to any person obtaining a copy
8 | // of this software and associated documentation files (the "Software"), to deal
9 | // in the Software without restriction, including without limitation the rights
10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | // copies of the Software, and to permit persons to whom the Software is
12 | // furnished to do so, subject to the following conditions:
13 | //
14 | // The above copyright notice and this permission notice shall be included in all
15 | // copies or substantial portions of the Software.
16 | //
17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 | // SOFTWARE.
24 | //
25 |
26 | #import "SFCircleGradientView.h"
27 | #import "SFCircleGradientLayer.h"
28 |
29 | @implementation SFCircleGradientView
30 | {
31 | SFCircleGradientLayer *_gradientLayer;
32 | }
33 |
34 | - (instancetype)initWithCoder:(NSCoder *)coder
35 | {
36 | self = [super initWithCoder:coder];
37 | if (self) {
38 | [self initView:[self frame]];
39 | }
40 | return self;
41 | }
42 |
43 | - (instancetype)init
44 | {
45 | self = [super init];
46 | if (self) {
47 | [self initView:CGRectNull];
48 | }
49 | return self;
50 | }
51 |
52 | - (instancetype)initWithFrame:(CGRect)frame
53 | {
54 | self = [super initWithFrame:frame];
55 | if (self) {
56 | [self initView:frame];
57 | }
58 | return self;
59 | }
60 |
61 | - (void)initView:(CGRect)frame
62 | {
63 | [self setBackgroundColor:[UIColor clearColor]];
64 |
65 | _gradientLayer = [self progressLayer];
66 | _gradientLayer.startColor = [UIColor blackColor];
67 | _gradientLayer.endColor = [UIColor greenColor];
68 |
69 | [self updateLayerData:frame];
70 |
71 | self.progress = 1;
72 | self.lineWidth = 3;
73 | }
74 |
75 | - (void)setProgress:(CGFloat)progress
76 | {
77 | _progress = MAX(0, MIN(1, progress));
78 | _gradientLayer.progress = progress;
79 | }
80 |
81 | - (void)setLineWidth:(CGFloat)value
82 | {
83 | _lineWidth = value;
84 | [self updateLayerData:self.frame];
85 | }
86 |
87 | - (void)setStartColor:(UIColor *)startColor
88 | {
89 | _startColor = startColor;
90 | _gradientLayer.startColor = startColor;
91 | }
92 |
93 | - (void)setEndColor:(UIColor *)endColor
94 | {
95 | _endColor = endColor;
96 | _gradientLayer.endColor = endColor;
97 | }
98 |
99 | - (void)setStartAngle:(CGFloat)startAngle
100 | {
101 | _startAngle = startAngle;
102 | _gradientLayer.startAngle = startAngle;
103 | }
104 |
105 | - (void)setEndAngle:(CGFloat)endAngle
106 | {
107 | _endAngle = endAngle;
108 | _gradientLayer.endAngle = endAngle;
109 | }
110 |
111 | - (void)setRoundedCorners:(BOOL)roundedCorners
112 | {
113 | _roundedCorners = roundedCorners;
114 | _gradientLayer.roundedCorners = roundedCorners;
115 | }
116 |
117 | - (void)updateLayerData:(CGRect)frame
118 | {
119 | int numSegments = 16;
120 | CGFloat circleRadius = MIN(CGRectGetWidth(frame), CGRectGetHeight(frame))/2;
121 | CGFloat circleWidth = _lineWidth;
122 |
123 | _gradientLayer.frame = frame;
124 | _gradientLayer.numSegments = numSegments;
125 | _gradientLayer.circleRadius = circleRadius;
126 | _gradientLayer.circleWidth = circleWidth;
127 | }
128 |
129 | - (void)layoutSubviews
130 | {
131 | [super layoutSubviews];
132 | [self updateLayerData:self.frame];
133 | }
134 |
135 | - (void)setProgress:(CGFloat)progress animateWithDuration:(NSTimeInterval)duration
136 | {
137 | float currentValue = self.progress;
138 | self.progress = progress;
139 | self.progressLayer.progress = progress;
140 |
141 | CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"progress"];
142 | anim.fromValue = @(currentValue);
143 | anim.toValue = @(progress);
144 | anim.duration = duration;
145 | anim.repeatCount = 0;
146 | anim.autoreverses = NO;
147 | anim.removedOnCompletion = YES;
148 | anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
149 | [self.progressLayer addAnimation:anim forKey:@"progress"];
150 | }
151 |
152 | - (void)abortAnimation
153 | {
154 | [self.progressLayer removeAnimationForKey:@"progress"];
155 | }
156 |
157 | - (SFCircleGradientLayer*)progressLayer{
158 | SFCircleGradientLayer* layer = (SFCircleGradientLayer*) self.layer;
159 | layer.contentsScale = [UIScreen mainScreen].scale;
160 | return layer;
161 | }
162 |
163 | + (Class)layerClass
164 | {
165 | return [SFCircleGradientLayer class];
166 | }
167 |
168 | @end
169 |
--------------------------------------------------------------------------------
/Source/SFCircleGradientLayer.m:
--------------------------------------------------------------------------------
1 | //
2 | // SFCircleGradientLayer.m
3 | //
4 | // The MIT License (MIT)
5 | // Copyright (c) 2016 SFÇD
6 | //
7 | // Permission is hereby granted, free of charge, to any person obtaining a copy
8 | // of this software and associated documentation files (the "Software"), to deal
9 | // in the Software without restriction, including without limitation the rights
10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | // copies of the Software, and to permit persons to whom the Software is
12 | // furnished to do so, subject to the following conditions:
13 | //
14 | // The above copyright notice and this permission notice shall be included in all
15 | // copies or substantial portions of the Software.
16 | //
17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 | // SOFTWARE.
24 | //
25 |
26 | #import "SFCircleGradientLayer.h"
27 |
28 | @implementation SFCircleGradientLayer
29 |
30 | - (id)init
31 | {
32 | if (self = [super init]) {
33 | self.startAngle = -M_PI_2;
34 | self.endAngle = 2 * M_PI - M_PI_2;
35 | }
36 | return self;
37 | }
38 |
39 | - (id)initWithLayer:(id)param
40 | {
41 | if (self = [super initWithLayer:param]) {
42 | SFCircleGradientLayer *layer = (SFCircleGradientLayer*)param;
43 | self.progress = layer.progress;
44 | self.startColor = layer.startColor;
45 | self.endColor = layer.endColor;
46 | self.startAngle = layer.startAngle;
47 | self.endAngle = layer.endAngle;
48 | self.numSegments = layer.numSegments;
49 | self.circleRadius = layer.circleRadius;
50 | self.circleWidth = layer.circleWidth;
51 | self.roundedCorners = layer.roundedCorners;
52 | }
53 | return self;
54 | }
55 |
56 | - (void)setNumSegments:(int)numSegments
57 | {
58 | _numSegments = MAX(2, numSegments);
59 | [self setNeedsDisplay];
60 | }
61 |
62 | - (void)setCircleRadius:(CGFloat)circleRadius
63 | {
64 | _circleRadius = circleRadius;
65 | [self setNeedsDisplay];
66 | }
67 |
68 | - (void)setCircleWidth:(CGFloat)circleWidth
69 | {
70 | _circleWidth = circleWidth;
71 | [self setNeedsDisplay];
72 | }
73 |
74 | - (void)setProgress:(CGFloat)progress
75 | {
76 | _progress = MAX(0, MIN(1, progress));
77 | [self setNeedsDisplay];
78 | }
79 |
80 | + (BOOL)needsDisplayForKey:(NSString *)key
81 | {
82 | if ([key isEqualToString:@"startColor"]) {
83 | return YES;
84 | }
85 | if ([key isEqualToString:@"endColor"]) {
86 | return YES;
87 | }
88 | if ([key isEqualToString:@"startAngle"]) {
89 | return YES;
90 | }
91 | if ([key isEqualToString:@"endAngle"]) {
92 | return YES;
93 | }
94 | if ([key isEqualToString:@"progress"]) {
95 | return YES;
96 | }
97 | return [super needsDisplayForKey:key];
98 | }
99 |
100 | - (void)drawInContext:(CGContextRef)ctx
101 | {
102 | [super drawInContext:ctx];
103 | [self drawWithSegmentNumber:_numSegments - 1 context:ctx];
104 | [self drawWithSegmentNumber:_numSegments context:ctx];
105 | }
106 |
107 | - (void)drawWithSegmentNumber:(int)segmentCount context:(CGContextRef)ctx
108 | {
109 | CGFloat durationAngle = (self.endAngle - self.startAngle) * self.progress;
110 | if (_circleRadius * durationAngle < 0.001) {
111 | return;
112 | }
113 |
114 | CGFloat endAngle = self.startAngle + durationAngle;
115 | CGRect bounds = self.bounds;
116 | CGPoint centerPoint = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
117 |
118 | CGFloat c1[4];
119 | [_startColor getRed:&c1[0] green:&c1[1] blue:&c1[2] alpha:&c1[3]];
120 | CGFloat c2[4];
121 | [_endColor getRed:&c2[0] green:&c2[1] blue:&c2[2] alpha:&c2[3]];
122 |
123 | UIColor *fromColor = self.startColor;
124 | for(int i = 0; i < segmentCount; ++i)
125 | {
126 | CGFloat f_cur = (CGFloat)(i) / segmentCount;
127 | CGFloat f = (CGFloat)(i + 1) / segmentCount;
128 |
129 | UIColor *toColor = [UIColor colorWithRed:f * c2[0] + (1 - f) * c1[0]
130 | green:f * c2[1] + (1 - f) * c1[1]
131 | blue:f * c2[2] + (1 - f) * c1[2]
132 | alpha:f * c2[3] + (1 - f) * c1[3]];
133 |
134 | CGFloat fromAngleCur = self.startAngle + f_cur * (endAngle - self.startAngle);
135 | CGFloat toAngleCur = self.startAngle + f * (endAngle - self.startAngle);
136 | [self drawSegmentAtCenter:centerPoint from:fromAngleCur to:toAngleCur radius:_circleRadius width:_circleWidth
137 | startColor:fromColor endColor:toColor context:ctx];
138 |
139 | fromColor = toColor;
140 | }
141 | }
142 |
143 | - (void)drawSegmentAtCenter:(CGPoint)center
144 | from:(CGFloat)startAngle
145 | to:(CGFloat)endAngle
146 | radius:(CGFloat)radius
147 | width:(CGFloat)width
148 | startColor:(UIColor *)startColor
149 | endColor:(UIColor*)endColor
150 | context:(CGContextRef)ctx
151 | {
152 | CGContextSaveGState(ctx);
153 | CGContextSetLineWidth(ctx, width);
154 | CGLineCap lineCap = self.roundedCorners ? kCGLineCapRound : kCGLineCapButt;
155 | CGContextSetLineCap(ctx, lineCap);
156 |
157 | UIBezierPath *path = [UIBezierPath bezierPath];
158 | [path addArcWithCenter:center radius:radius - width * 0.5f startAngle:startAngle endAngle:endAngle clockwise:YES];
159 | CGContextAddPath(ctx, path.CGPath);
160 | CGContextReplacePathWithStrokedPath(ctx);
161 | CGContextClip(ctx);
162 |
163 | CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
164 | CGFloat locations[] = { 0.0, 1.0 };
165 | NSArray *colors = @[(__bridge id) startColor.CGColor, (__bridge id) endColor.CGColor];
166 | CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef) colors, locations);
167 |
168 | CGPoint startPoint = CGPointMake(center.x-sinf(startAngle-M_PI_2)*radius, center.y+cosf(startAngle-M_PI_2)*radius);
169 | CGPoint endPoint = CGPointMake(center.x-sinf(endAngle-M_PI_2)*radius, center.y+cosf(endAngle-M_PI_2)*radius);
170 | CGContextDrawLinearGradient(ctx, gradient, startPoint, endPoint,
171 | kCGGradientDrawsAfterEndLocation|kCGGradientDrawsBeforeStartLocation);
172 |
173 | CGGradientRelease(gradient);
174 | CGColorSpaceRelease(colorSpace);
175 |
176 | CGContextRestoreGState(ctx);
177 | }
178 |
179 | @end
180 |
--------------------------------------------------------------------------------
/SFProgressCircle.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 47;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 0B0F7D281D41228700821B00 /* SFCircleGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B0F7D241D41228700821B00 /* SFCircleGradientLayer.m */; };
11 | 0B0F7D2A1D41228700821B00 /* SFCircleGradientView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B0F7D261D41228700821B00 /* SFCircleGradientView.m */; };
12 | 0B183C971D4143FF009A3026 /* SFProgressCircle.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B9359A41D413E1D00887C73 /* SFProgressCircle.h */; settings = {ATTRIBUTES = (Public, ); }; };
13 | 0B183C9E1D414806009A3026 /* SFCircleGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B0F7D231D41228700821B00 /* SFCircleGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; };
14 | 0B183C9F1D414806009A3026 /* SFCircleGradientView.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B0F7D251D41228700821B00 /* SFCircleGradientView.h */; settings = {ATTRIBUTES = (Public, ); }; };
15 | /* End PBXBuildFile section */
16 |
17 | /* Begin PBXFileReference section */
18 | 0B0F7D171D41071500821B00 /* SFProgressCircle.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SFProgressCircle.framework; sourceTree = BUILT_PRODUCTS_DIR; };
19 | 0B0F7D231D41228700821B00 /* SFCircleGradientLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFCircleGradientLayer.h; sourceTree = ""; };
20 | 0B0F7D241D41228700821B00 /* SFCircleGradientLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFCircleGradientLayer.m; sourceTree = ""; };
21 | 0B0F7D251D41228700821B00 /* SFCircleGradientView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFCircleGradientView.h; sourceTree = ""; };
22 | 0B0F7D261D41228700821B00 /* SFCircleGradientView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFCircleGradientView.m; sourceTree = ""; };
23 | 0B9359A31D413E1D00887C73 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
24 | 0B9359A41D413E1D00887C73 /* SFProgressCircle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFProgressCircle.h; sourceTree = ""; };
25 | /* End PBXFileReference section */
26 |
27 | /* Begin PBXFrameworksBuildPhase section */
28 | 0B0F7D131D41071500821B00 /* Frameworks */ = {
29 | isa = PBXFrameworksBuildPhase;
30 | buildActionMask = 2147483647;
31 | files = (
32 | );
33 | runOnlyForDeploymentPostprocessing = 0;
34 | };
35 | /* End PBXFrameworksBuildPhase section */
36 |
37 | /* Begin PBXGroup section */
38 | 0B0F7D0D1D41071500821B00 = {
39 | isa = PBXGroup;
40 | children = (
41 | 0B0F7D221D41228700821B00 /* Source */,
42 | 0B0F7D181D41071500821B00 /* Products */,
43 | );
44 | sourceTree = "";
45 | };
46 | 0B0F7D181D41071500821B00 /* Products */ = {
47 | isa = PBXGroup;
48 | children = (
49 | 0B0F7D171D41071500821B00 /* SFProgressCircle.framework */,
50 | );
51 | name = Products;
52 | sourceTree = "";
53 | };
54 | 0B0F7D221D41228700821B00 /* Source */ = {
55 | isa = PBXGroup;
56 | children = (
57 | 0B0F7D231D41228700821B00 /* SFCircleGradientLayer.h */,
58 | 0B0F7D241D41228700821B00 /* SFCircleGradientLayer.m */,
59 | 0B0F7D251D41228700821B00 /* SFCircleGradientView.h */,
60 | 0B0F7D261D41228700821B00 /* SFCircleGradientView.m */,
61 | 0B9359A21D413E1100887C73 /* Supporting Files */,
62 | );
63 | path = Source;
64 | sourceTree = "";
65 | };
66 | 0B9359A21D413E1100887C73 /* Supporting Files */ = {
67 | isa = PBXGroup;
68 | children = (
69 | 0B9359A31D413E1D00887C73 /* Info.plist */,
70 | 0B9359A41D413E1D00887C73 /* SFProgressCircle.h */,
71 | );
72 | name = "Supporting Files";
73 | sourceTree = "";
74 | };
75 | /* End PBXGroup section */
76 |
77 | /* Begin PBXHeadersBuildPhase section */
78 | 0B0F7D141D41071500821B00 /* Headers */ = {
79 | isa = PBXHeadersBuildPhase;
80 | buildActionMask = 2147483647;
81 | files = (
82 | 0B183C971D4143FF009A3026 /* SFProgressCircle.h in Headers */,
83 | 0B183C9E1D414806009A3026 /* SFCircleGradientLayer.h in Headers */,
84 | 0B183C9F1D414806009A3026 /* SFCircleGradientView.h in Headers */,
85 | );
86 | runOnlyForDeploymentPostprocessing = 0;
87 | };
88 | /* End PBXHeadersBuildPhase section */
89 |
90 | /* Begin PBXNativeTarget section */
91 | 0B0F7D161D41071500821B00 /* SFProgressCircle */ = {
92 | isa = PBXNativeTarget;
93 | buildConfigurationList = 0B0F7D1F1D41071500821B00 /* Build configuration list for PBXNativeTarget "SFProgressCircle" */;
94 | buildPhases = (
95 | 0B0F7D121D41071500821B00 /* Sources */,
96 | 0B0F7D131D41071500821B00 /* Frameworks */,
97 | 0B0F7D141D41071500821B00 /* Headers */,
98 | );
99 | buildRules = (
100 | );
101 | dependencies = (
102 | );
103 | name = SFProgressCircle;
104 | productName = SFProgressCircle;
105 | productReference = 0B0F7D171D41071500821B00 /* SFProgressCircle.framework */;
106 | productType = "com.apple.product-type.framework";
107 | };
108 | /* End PBXNativeTarget section */
109 |
110 | /* Begin PBXProject section */
111 | 0B0F7D0E1D41071500821B00 /* Project object */ = {
112 | isa = PBXProject;
113 | attributes = {
114 | CLASSPREFIX = "";
115 | LastUpgradeCheck = 1000;
116 | ORGANIZATIONNAME = "SFÇD";
117 | TargetAttributes = {
118 | 0B0F7D161D41071500821B00 = {
119 | CreatedOnToolsVersion = 7.3.1;
120 | };
121 | };
122 | };
123 | buildConfigurationList = 0B0F7D111D41071500821B00 /* Build configuration list for PBXProject "SFProgressCircle" */;
124 | compatibilityVersion = "Xcode 6.3";
125 | developmentRegion = English;
126 | hasScannedForEncodings = 0;
127 | knownRegions = (
128 | en,
129 | );
130 | mainGroup = 0B0F7D0D1D41071500821B00;
131 | productRefGroup = 0B0F7D181D41071500821B00 /* Products */;
132 | projectDirPath = "";
133 | projectRoot = "";
134 | targets = (
135 | 0B0F7D161D41071500821B00 /* SFProgressCircle */,
136 | );
137 | };
138 | /* End PBXProject section */
139 |
140 | /* Begin PBXSourcesBuildPhase section */
141 | 0B0F7D121D41071500821B00 /* Sources */ = {
142 | isa = PBXSourcesBuildPhase;
143 | buildActionMask = 2147483647;
144 | files = (
145 | 0B0F7D281D41228700821B00 /* SFCircleGradientLayer.m in Sources */,
146 | 0B0F7D2A1D41228700821B00 /* SFCircleGradientView.m in Sources */,
147 | );
148 | runOnlyForDeploymentPostprocessing = 0;
149 | };
150 | /* End PBXSourcesBuildPhase section */
151 |
152 | /* Begin XCBuildConfiguration section */
153 | 0B0F7D1D1D41071500821B00 /* Debug */ = {
154 | isa = XCBuildConfiguration;
155 | buildSettings = {
156 | ALWAYS_SEARCH_USER_PATHS = NO;
157 | CLANG_ANALYZER_NONNULL = YES;
158 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
159 | CLANG_CXX_LIBRARY = "libc++";
160 | CLANG_ENABLE_MODULES = YES;
161 | CLANG_ENABLE_OBJC_ARC = YES;
162 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
163 | CLANG_WARN_BOOL_CONVERSION = YES;
164 | CLANG_WARN_COMMA = YES;
165 | CLANG_WARN_CONSTANT_CONVERSION = YES;
166 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
167 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
168 | CLANG_WARN_EMPTY_BODY = YES;
169 | CLANG_WARN_ENUM_CONVERSION = YES;
170 | CLANG_WARN_INFINITE_RECURSION = YES;
171 | CLANG_WARN_INT_CONVERSION = YES;
172 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
173 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
174 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
175 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
176 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
177 | CLANG_WARN_STRICT_PROTOTYPES = YES;
178 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
179 | CLANG_WARN_UNREACHABLE_CODE = YES;
180 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
181 | CODE_SIGN_IDENTITY = "iPhone Developer";
182 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
183 | COPY_PHASE_STRIP = NO;
184 | CURRENT_PROJECT_VERSION = 1;
185 | DEBUG_INFORMATION_FORMAT = dwarf;
186 | ENABLE_STRICT_OBJC_MSGSEND = YES;
187 | ENABLE_TESTABILITY = YES;
188 | GCC_C_LANGUAGE_STANDARD = gnu99;
189 | GCC_DYNAMIC_NO_PIC = NO;
190 | GCC_NO_COMMON_BLOCKS = YES;
191 | GCC_OPTIMIZATION_LEVEL = 0;
192 | GCC_PREPROCESSOR_DEFINITIONS = (
193 | "DEBUG=1",
194 | "$(inherited)",
195 | );
196 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
197 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
198 | GCC_WARN_UNDECLARED_SELECTOR = YES;
199 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
200 | GCC_WARN_UNUSED_FUNCTION = YES;
201 | GCC_WARN_UNUSED_VARIABLE = YES;
202 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
203 | MTL_ENABLE_DEBUG_INFO = YES;
204 | ONLY_ACTIVE_ARCH = YES;
205 | SDKROOT = iphoneos;
206 | TARGETED_DEVICE_FAMILY = "1,2";
207 | VERSIONING_SYSTEM = "apple-generic";
208 | VERSION_INFO_PREFIX = "";
209 | };
210 | name = Debug;
211 | };
212 | 0B0F7D1E1D41071500821B00 /* Release */ = {
213 | isa = XCBuildConfiguration;
214 | buildSettings = {
215 | ALWAYS_SEARCH_USER_PATHS = NO;
216 | CLANG_ANALYZER_NONNULL = YES;
217 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
218 | CLANG_CXX_LIBRARY = "libc++";
219 | CLANG_ENABLE_MODULES = YES;
220 | CLANG_ENABLE_OBJC_ARC = YES;
221 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
222 | CLANG_WARN_BOOL_CONVERSION = YES;
223 | CLANG_WARN_COMMA = YES;
224 | CLANG_WARN_CONSTANT_CONVERSION = YES;
225 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
226 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
227 | CLANG_WARN_EMPTY_BODY = YES;
228 | CLANG_WARN_ENUM_CONVERSION = YES;
229 | CLANG_WARN_INFINITE_RECURSION = YES;
230 | CLANG_WARN_INT_CONVERSION = YES;
231 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
232 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
233 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
234 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
235 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
236 | CLANG_WARN_STRICT_PROTOTYPES = YES;
237 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
238 | CLANG_WARN_UNREACHABLE_CODE = YES;
239 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
240 | CODE_SIGN_IDENTITY = "iPhone Developer";
241 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
242 | COPY_PHASE_STRIP = NO;
243 | CURRENT_PROJECT_VERSION = 1;
244 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
245 | ENABLE_NS_ASSERTIONS = NO;
246 | ENABLE_STRICT_OBJC_MSGSEND = YES;
247 | GCC_C_LANGUAGE_STANDARD = gnu99;
248 | GCC_NO_COMMON_BLOCKS = YES;
249 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
250 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
251 | GCC_WARN_UNDECLARED_SELECTOR = YES;
252 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
253 | GCC_WARN_UNUSED_FUNCTION = YES;
254 | GCC_WARN_UNUSED_VARIABLE = YES;
255 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
256 | MTL_ENABLE_DEBUG_INFO = NO;
257 | SDKROOT = iphoneos;
258 | TARGETED_DEVICE_FAMILY = "1,2";
259 | VALIDATE_PRODUCT = YES;
260 | VERSIONING_SYSTEM = "apple-generic";
261 | VERSION_INFO_PREFIX = "";
262 | };
263 | name = Release;
264 | };
265 | 0B0F7D201D41071500821B00 /* Debug */ = {
266 | isa = XCBuildConfiguration;
267 | buildSettings = {
268 | APPLICATION_EXTENSION_API_ONLY = NO;
269 | CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
270 | CODE_SIGN_IDENTITY = "";
271 | DEFINES_MODULE = YES;
272 | DYLIB_COMPATIBILITY_VERSION = 1;
273 | DYLIB_CURRENT_VERSION = 1;
274 | DYLIB_INSTALL_NAME_BASE = "@rpath";
275 | INFOPLIST_FILE = Source/Info.plist;
276 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
277 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
278 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
279 | PRODUCT_BUNDLE_IDENTIFIER = SFProgressCircle;
280 | PRODUCT_NAME = "$(TARGET_NAME)";
281 | SKIP_INSTALL = YES;
282 | };
283 | name = Debug;
284 | };
285 | 0B0F7D211D41071500821B00 /* Release */ = {
286 | isa = XCBuildConfiguration;
287 | buildSettings = {
288 | APPLICATION_EXTENSION_API_ONLY = NO;
289 | CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
290 | CODE_SIGN_IDENTITY = "";
291 | DEFINES_MODULE = YES;
292 | DYLIB_COMPATIBILITY_VERSION = 1;
293 | DYLIB_CURRENT_VERSION = 1;
294 | DYLIB_INSTALL_NAME_BASE = "@rpath";
295 | INFOPLIST_FILE = Source/Info.plist;
296 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
297 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
298 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
299 | PRODUCT_BUNDLE_IDENTIFIER = SFProgressCircle;
300 | PRODUCT_NAME = "$(TARGET_NAME)";
301 | SKIP_INSTALL = YES;
302 | };
303 | name = Release;
304 | };
305 | /* End XCBuildConfiguration section */
306 |
307 | /* Begin XCConfigurationList section */
308 | 0B0F7D111D41071500821B00 /* Build configuration list for PBXProject "SFProgressCircle" */ = {
309 | isa = XCConfigurationList;
310 | buildConfigurations = (
311 | 0B0F7D1D1D41071500821B00 /* Debug */,
312 | 0B0F7D1E1D41071500821B00 /* Release */,
313 | );
314 | defaultConfigurationIsVisible = 0;
315 | defaultConfigurationName = Release;
316 | };
317 | 0B0F7D1F1D41071500821B00 /* Build configuration list for PBXNativeTarget "SFProgressCircle" */ = {
318 | isa = XCConfigurationList;
319 | buildConfigurations = (
320 | 0B0F7D201D41071500821B00 /* Debug */,
321 | 0B0F7D211D41071500821B00 /* Release */,
322 | );
323 | defaultConfigurationIsVisible = 0;
324 | defaultConfigurationName = Release;
325 | };
326 | /* End XCConfigurationList section */
327 | };
328 | rootObject = 0B0F7D0E1D41071500821B00 /* Project object */;
329 | }
330 |
--------------------------------------------------------------------------------
/Example/Example.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 47;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 0B26D1EF1D4130CB000129E4 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0B26D1EE1D4130CB000129E4 /* LaunchScreen.storyboard */; };
11 | 0B9359BD1D413FEB00887C73 /* SFProgressCircle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0B9359AC1D413E6200887C73 /* SFProgressCircle.framework */; };
12 | 0B9359BE1D413FEB00887C73 /* SFProgressCircle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0B9359AC1D413E6200887C73 /* SFProgressCircle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
13 | 0BF665751D4128D5005528E9 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BF665721D4128D5005528E9 /* AppDelegate.m */; };
14 | 0BF665761D4128D5005528E9 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BF665741D4128D5005528E9 /* ViewController.m */; };
15 | 0BF6657F1D4128E7005528E9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0BF665781D4128E7005528E9 /* Assets.xcassets */; };
16 | 0BF665831D4128E7005528E9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BF6657E1D4128E7005528E9 /* main.m */; };
17 | /* End PBXBuildFile section */
18 |
19 | /* Begin PBXContainerItemProxy section */
20 | 0B9359AB1D413E6200887C73 /* PBXContainerItemProxy */ = {
21 | isa = PBXContainerItemProxy;
22 | containerPortal = 0B9359A71D413E6200887C73 /* SFProgressCircle.xcodeproj */;
23 | proxyType = 2;
24 | remoteGlobalIDString = 0B0F7D171D41071500821B00;
25 | remoteInfo = SFProgressCircle;
26 | };
27 | 0B9359BF1D413FEB00887C73 /* PBXContainerItemProxy */ = {
28 | isa = PBXContainerItemProxy;
29 | containerPortal = 0B9359A71D413E6200887C73 /* SFProgressCircle.xcodeproj */;
30 | proxyType = 1;
31 | remoteGlobalIDString = 0B0F7D161D41071500821B00;
32 | remoteInfo = SFProgressCircle;
33 | };
34 | /* End PBXContainerItemProxy section */
35 |
36 | /* Begin PBXCopyFilesBuildPhase section */
37 | 0B9359BA1D413FB800887C73 /* Embed Frameworks */ = {
38 | isa = PBXCopyFilesBuildPhase;
39 | buildActionMask = 2147483647;
40 | dstPath = "";
41 | dstSubfolderSpec = 10;
42 | files = (
43 | 0B9359BE1D413FEB00887C73 /* SFProgressCircle.framework in Embed Frameworks */,
44 | );
45 | name = "Embed Frameworks";
46 | runOnlyForDeploymentPostprocessing = 0;
47 | };
48 | /* End PBXCopyFilesBuildPhase section */
49 |
50 | /* Begin PBXFileReference section */
51 | 0B26D1EE1D4130CB000129E4 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; };
52 | 0B9359A71D413E6200887C73 /* SFProgressCircle.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SFProgressCircle.xcodeproj; path = ../SFProgressCircle.xcodeproj; sourceTree = ""; };
53 | 0BF665491D41284C005528E9 /* SFProgressCircle.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SFProgressCircle.app; sourceTree = BUILT_PRODUCTS_DIR; };
54 | 0BF665711D4128D5005528E9 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
55 | 0BF665721D4128D5005528E9 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
56 | 0BF665731D4128D5005528E9 /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; };
57 | 0BF665741D4128D5005528E9 /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; };
58 | 0BF665781D4128E7005528E9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
59 | 0BF6657D1D4128E7005528E9 /* ExampleInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = ExampleInfo.plist; sourceTree = ""; };
60 | 0BF6657E1D4128E7005528E9 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
61 | /* End PBXFileReference section */
62 |
63 | /* Begin PBXFrameworksBuildPhase section */
64 | 0BF665461D41284C005528E9 /* Frameworks */ = {
65 | isa = PBXFrameworksBuildPhase;
66 | buildActionMask = 2147483647;
67 | files = (
68 | 0B9359BD1D413FEB00887C73 /* SFProgressCircle.framework in Frameworks */,
69 | );
70 | runOnlyForDeploymentPostprocessing = 0;
71 | };
72 | /* End PBXFrameworksBuildPhase section */
73 |
74 | /* Begin PBXGroup section */
75 | 0B9359A81D413E6200887C73 /* Products */ = {
76 | isa = PBXGroup;
77 | children = (
78 | 0B9359AC1D413E6200887C73 /* SFProgressCircle.framework */,
79 | );
80 | name = Products;
81 | sourceTree = "";
82 | };
83 | 0BF665401D41284C005528E9 = {
84 | isa = PBXGroup;
85 | children = (
86 | 0B9359A71D413E6200887C73 /* SFProgressCircle.xcodeproj */,
87 | 0BF665701D4128D5005528E9 /* Source */,
88 | 0BF665771D4128E7005528E9 /* Resources */,
89 | 0BF6654A1D41284C005528E9 /* Products */,
90 | );
91 | sourceTree = "";
92 | };
93 | 0BF6654A1D41284C005528E9 /* Products */ = {
94 | isa = PBXGroup;
95 | children = (
96 | 0BF665491D41284C005528E9 /* SFProgressCircle.app */,
97 | );
98 | name = Products;
99 | sourceTree = "";
100 | };
101 | 0BF665701D4128D5005528E9 /* Source */ = {
102 | isa = PBXGroup;
103 | children = (
104 | 0BF665711D4128D5005528E9 /* AppDelegate.h */,
105 | 0BF665721D4128D5005528E9 /* AppDelegate.m */,
106 | 0BF665731D4128D5005528E9 /* ViewController.h */,
107 | 0BF665741D4128D5005528E9 /* ViewController.m */,
108 | );
109 | path = Source;
110 | sourceTree = "";
111 | };
112 | 0BF665771D4128E7005528E9 /* Resources */ = {
113 | isa = PBXGroup;
114 | children = (
115 | 0BF665781D4128E7005528E9 /* Assets.xcassets */,
116 | 0BF6657D1D4128E7005528E9 /* ExampleInfo.plist */,
117 | 0BF6657E1D4128E7005528E9 /* main.m */,
118 | 0B26D1EE1D4130CB000129E4 /* LaunchScreen.storyboard */,
119 | );
120 | path = Resources;
121 | sourceTree = "";
122 | };
123 | /* End PBXGroup section */
124 |
125 | /* Begin PBXNativeTarget section */
126 | 0BF665481D41284C005528E9 /* Example */ = {
127 | isa = PBXNativeTarget;
128 | buildConfigurationList = 0BF665601D41284C005528E9 /* Build configuration list for PBXNativeTarget "Example" */;
129 | buildPhases = (
130 | 0BF665451D41284C005528E9 /* Sources */,
131 | 0BF665461D41284C005528E9 /* Frameworks */,
132 | 0BF665471D41284C005528E9 /* Resources */,
133 | 0B9359BA1D413FB800887C73 /* Embed Frameworks */,
134 | );
135 | buildRules = (
136 | );
137 | dependencies = (
138 | 0B9359C01D413FEB00887C73 /* PBXTargetDependency */,
139 | );
140 | name = Example;
141 | productName = Example;
142 | productReference = 0BF665491D41284C005528E9 /* SFProgressCircle.app */;
143 | productType = "com.apple.product-type.application";
144 | };
145 | /* End PBXNativeTarget section */
146 |
147 | /* Begin PBXProject section */
148 | 0BF665411D41284C005528E9 /* Project object */ = {
149 | isa = PBXProject;
150 | attributes = {
151 | LastUpgradeCheck = 1000;
152 | ORGANIZATIONNAME = "SFÇD";
153 | TargetAttributes = {
154 | 0BF665481D41284C005528E9 = {
155 | CreatedOnToolsVersion = 7.3.1;
156 | };
157 | };
158 | };
159 | buildConfigurationList = 0BF665441D41284C005528E9 /* Build configuration list for PBXProject "Example" */;
160 | compatibilityVersion = "Xcode 6.3";
161 | developmentRegion = English;
162 | hasScannedForEncodings = 0;
163 | knownRegions = (
164 | en,
165 | Base,
166 | );
167 | mainGroup = 0BF665401D41284C005528E9;
168 | productRefGroup = 0BF6654A1D41284C005528E9 /* Products */;
169 | projectDirPath = "";
170 | projectReferences = (
171 | {
172 | ProductGroup = 0B9359A81D413E6200887C73 /* Products */;
173 | ProjectRef = 0B9359A71D413E6200887C73 /* SFProgressCircle.xcodeproj */;
174 | },
175 | );
176 | projectRoot = "";
177 | targets = (
178 | 0BF665481D41284C005528E9 /* Example */,
179 | );
180 | };
181 | /* End PBXProject section */
182 |
183 | /* Begin PBXReferenceProxy section */
184 | 0B9359AC1D413E6200887C73 /* SFProgressCircle.framework */ = {
185 | isa = PBXReferenceProxy;
186 | fileType = wrapper.framework;
187 | path = SFProgressCircle.framework;
188 | remoteRef = 0B9359AB1D413E6200887C73 /* PBXContainerItemProxy */;
189 | sourceTree = BUILT_PRODUCTS_DIR;
190 | };
191 | /* End PBXReferenceProxy section */
192 |
193 | /* Begin PBXResourcesBuildPhase section */
194 | 0BF665471D41284C005528E9 /* Resources */ = {
195 | isa = PBXResourcesBuildPhase;
196 | buildActionMask = 2147483647;
197 | files = (
198 | 0B26D1EF1D4130CB000129E4 /* LaunchScreen.storyboard in Resources */,
199 | 0BF6657F1D4128E7005528E9 /* Assets.xcassets in Resources */,
200 | );
201 | runOnlyForDeploymentPostprocessing = 0;
202 | };
203 | /* End PBXResourcesBuildPhase section */
204 |
205 | /* Begin PBXSourcesBuildPhase section */
206 | 0BF665451D41284C005528E9 /* Sources */ = {
207 | isa = PBXSourcesBuildPhase;
208 | buildActionMask = 2147483647;
209 | files = (
210 | 0BF665761D4128D5005528E9 /* ViewController.m in Sources */,
211 | 0BF665831D4128E7005528E9 /* main.m in Sources */,
212 | 0BF665751D4128D5005528E9 /* AppDelegate.m in Sources */,
213 | );
214 | runOnlyForDeploymentPostprocessing = 0;
215 | };
216 | /* End PBXSourcesBuildPhase section */
217 |
218 | /* Begin PBXTargetDependency section */
219 | 0B9359C01D413FEB00887C73 /* PBXTargetDependency */ = {
220 | isa = PBXTargetDependency;
221 | name = SFProgressCircle;
222 | targetProxy = 0B9359BF1D413FEB00887C73 /* PBXContainerItemProxy */;
223 | };
224 | /* End PBXTargetDependency section */
225 |
226 | /* Begin XCBuildConfiguration section */
227 | 0BF6655E1D41284C005528E9 /* Debug */ = {
228 | isa = XCBuildConfiguration;
229 | buildSettings = {
230 | ALWAYS_SEARCH_USER_PATHS = NO;
231 | CLANG_ANALYZER_NONNULL = YES;
232 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
233 | CLANG_CXX_LIBRARY = "libc++";
234 | CLANG_ENABLE_MODULES = YES;
235 | CLANG_ENABLE_OBJC_ARC = YES;
236 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
237 | CLANG_WARN_BOOL_CONVERSION = YES;
238 | CLANG_WARN_COMMA = YES;
239 | CLANG_WARN_CONSTANT_CONVERSION = YES;
240 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
241 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
242 | CLANG_WARN_EMPTY_BODY = YES;
243 | CLANG_WARN_ENUM_CONVERSION = YES;
244 | CLANG_WARN_INFINITE_RECURSION = YES;
245 | CLANG_WARN_INT_CONVERSION = YES;
246 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
247 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
248 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
249 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
250 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
251 | CLANG_WARN_STRICT_PROTOTYPES = YES;
252 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
253 | CLANG_WARN_UNREACHABLE_CODE = YES;
254 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
255 | CODE_SIGN_IDENTITY = "iPhone Developer";
256 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
257 | COPY_PHASE_STRIP = NO;
258 | DEBUG_INFORMATION_FORMAT = dwarf;
259 | ENABLE_STRICT_OBJC_MSGSEND = YES;
260 | ENABLE_TESTABILITY = YES;
261 | GCC_C_LANGUAGE_STANDARD = gnu99;
262 | GCC_DYNAMIC_NO_PIC = NO;
263 | GCC_NO_COMMON_BLOCKS = YES;
264 | GCC_OPTIMIZATION_LEVEL = 0;
265 | GCC_PREPROCESSOR_DEFINITIONS = (
266 | "DEBUG=1",
267 | "$(inherited)",
268 | );
269 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
270 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
271 | GCC_WARN_UNDECLARED_SELECTOR = YES;
272 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
273 | GCC_WARN_UNUSED_FUNCTION = YES;
274 | GCC_WARN_UNUSED_VARIABLE = YES;
275 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
276 | MTL_ENABLE_DEBUG_INFO = YES;
277 | ONLY_ACTIVE_ARCH = YES;
278 | SDKROOT = iphoneos;
279 | TARGETED_DEVICE_FAMILY = "1,2";
280 | };
281 | name = Debug;
282 | };
283 | 0BF6655F1D41284C005528E9 /* Release */ = {
284 | isa = XCBuildConfiguration;
285 | buildSettings = {
286 | ALWAYS_SEARCH_USER_PATHS = NO;
287 | CLANG_ANALYZER_NONNULL = YES;
288 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
289 | CLANG_CXX_LIBRARY = "libc++";
290 | CLANG_ENABLE_MODULES = YES;
291 | CLANG_ENABLE_OBJC_ARC = YES;
292 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
293 | CLANG_WARN_BOOL_CONVERSION = YES;
294 | CLANG_WARN_COMMA = YES;
295 | CLANG_WARN_CONSTANT_CONVERSION = YES;
296 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
297 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
298 | CLANG_WARN_EMPTY_BODY = YES;
299 | CLANG_WARN_ENUM_CONVERSION = YES;
300 | CLANG_WARN_INFINITE_RECURSION = YES;
301 | CLANG_WARN_INT_CONVERSION = YES;
302 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
303 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
304 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
305 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
306 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
307 | CLANG_WARN_STRICT_PROTOTYPES = YES;
308 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
309 | CLANG_WARN_UNREACHABLE_CODE = YES;
310 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
311 | CODE_SIGN_IDENTITY = "iPhone Developer";
312 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
313 | COPY_PHASE_STRIP = NO;
314 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
315 | ENABLE_NS_ASSERTIONS = NO;
316 | ENABLE_STRICT_OBJC_MSGSEND = YES;
317 | GCC_C_LANGUAGE_STANDARD = gnu99;
318 | GCC_NO_COMMON_BLOCKS = YES;
319 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
320 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
321 | GCC_WARN_UNDECLARED_SELECTOR = YES;
322 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
323 | GCC_WARN_UNUSED_FUNCTION = YES;
324 | GCC_WARN_UNUSED_VARIABLE = YES;
325 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
326 | MTL_ENABLE_DEBUG_INFO = NO;
327 | SDKROOT = iphoneos;
328 | TARGETED_DEVICE_FAMILY = "1,2";
329 | VALIDATE_PRODUCT = YES;
330 | };
331 | name = Release;
332 | };
333 | 0BF665611D41284C005528E9 /* Debug */ = {
334 | isa = XCBuildConfiguration;
335 | buildSettings = {
336 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
337 | CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
338 | GCC_PRECOMPILE_PREFIX_HEADER = NO;
339 | GCC_PREFIX_HEADER = "";
340 | INFOPLIST_FILE = "$(SRCROOT)/Resources/ExampleInfo.plist";
341 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
342 | LIBRARY_SEARCH_PATHS = "";
343 | PRODUCT_BUNDLE_IDENTIFIER = com.sfcd.SFProgressCircle;
344 | PRODUCT_NAME = SFProgressCircle;
345 | TARGETED_DEVICE_FAMILY = 1;
346 | };
347 | name = Debug;
348 | };
349 | 0BF665621D41284C005528E9 /* Release */ = {
350 | isa = XCBuildConfiguration;
351 | buildSettings = {
352 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
353 | CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
354 | GCC_PRECOMPILE_PREFIX_HEADER = NO;
355 | GCC_PREFIX_HEADER = "";
356 | INFOPLIST_FILE = "$(SRCROOT)/Resources/ExampleInfo.plist";
357 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
358 | LIBRARY_SEARCH_PATHS = "";
359 | PRODUCT_BUNDLE_IDENTIFIER = com.sfcd.SFProgressCircle;
360 | PRODUCT_NAME = SFProgressCircle;
361 | TARGETED_DEVICE_FAMILY = 1;
362 | };
363 | name = Release;
364 | };
365 | /* End XCBuildConfiguration section */
366 |
367 | /* Begin XCConfigurationList section */
368 | 0BF665441D41284C005528E9 /* Build configuration list for PBXProject "Example" */ = {
369 | isa = XCConfigurationList;
370 | buildConfigurations = (
371 | 0BF6655E1D41284C005528E9 /* Debug */,
372 | 0BF6655F1D41284C005528E9 /* Release */,
373 | );
374 | defaultConfigurationIsVisible = 0;
375 | defaultConfigurationName = Release;
376 | };
377 | 0BF665601D41284C005528E9 /* Build configuration list for PBXNativeTarget "Example" */ = {
378 | isa = XCConfigurationList;
379 | buildConfigurations = (
380 | 0BF665611D41284C005528E9 /* Debug */,
381 | 0BF665621D41284C005528E9 /* Release */,
382 | );
383 | defaultConfigurationIsVisible = 0;
384 | defaultConfigurationName = Release;
385 | };
386 | /* End XCConfigurationList section */
387 | };
388 | rootObject = 0BF665411D41284C005528E9 /* Project object */;
389 | }
390 |
--------------------------------------------------------------------------------