├── .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 | [![Build Status](https://travis-ci.org/sfcd/SFProgressCircle.svg?branch=master)](https://travis-ci.org/sfcd/SFProgressCircle) 4 | [![CocoaPods](https://img.shields.io/cocoapods/v/SFProgressCircle.svg)](https://img.shields.io/cocoapods/v/SFProgressCircle.svg?style=flat) 5 | [![Platform](https://img.shields.io/cocoapods/p/SFProgressCircle.svg)](http://cocoadocs.org/docsets/SFProgressCircle?style=flat) 6 | [![Twitter](https://img.shields.io/badge/twitter-SFCD-orange.svg)](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 | Example Usage Example Usage 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 | --------------------------------------------------------------------------------