├── Demo.gif ├── ITProgressIndicator ├── ITProgressIndicator │ ├── en.lproj │ │ ├── InfoPlist.strings │ │ └── Credits.rtf │ ├── ITProgressIndicator-Prefix.pch │ ├── AppDelegate.m │ ├── main.m │ ├── AppDelegate.h │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ └── ITProgressIndicator-Info.plist ├── ITProgressIndicatorTests │ ├── en.lproj │ │ └── InfoPlist.strings │ ├── ITProgressIndicatorTests-Info.plist │ └── ITProgressIndicatorTests.m ├── ITProgressIndicatorKit │ ├── ITProgressIndicatorKit.h │ └── Info.plist ├── Classes │ ├── ITProgressIndicator.h │ └── ITProgressIndicator.m └── ITProgressIndicator.xcodeproj │ ├── xcshareddata │ └── xcschemes │ │ └── ITProgressIndicatorKit.xcscheme │ └── project.pbxproj ├── .gitignore ├── LICENSE ├── ITProgressIndicator.podspec └── README.md /Demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iluuu1994/ITProgressIndicator/HEAD/Demo.gif -------------------------------------------------------------------------------- /ITProgressIndicator/ITProgressIndicator/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /ITProgressIndicator/ITProgressIndicatorTests/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /ITProgressIndicator/ITProgressIndicator/ITProgressIndicator-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #ifdef __OBJC__ 8 | #import 9 | #endif 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | .DS_Store 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | *.xcworkspace 13 | !default.xcworkspace 14 | xcuserdata 15 | profile 16 | *.moved-aside 17 | DerivedData 18 | .idea/ 19 | Carthage/Build 20 | -------------------------------------------------------------------------------- /ITProgressIndicator/ITProgressIndicator/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // ITProgressIndicator 4 | // 5 | // Created by Ilija Tovilo on 9/25/13. 6 | // Copyright (c) 2013 Ilija Tovilo. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "ITProgressIndicator.h" 11 | 12 | @implementation AppDelegate 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /ITProgressIndicator/ITProgressIndicator/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // ITProgressIndicator 4 | // 5 | // Created by Ilija Tovilo on 9/25/13. 6 | // Copyright (c) 2013 Ilija Tovilo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, const char * argv[]) 12 | { 13 | return NSApplicationMain(argc, argv); 14 | } 15 | -------------------------------------------------------------------------------- /ITProgressIndicator/ITProgressIndicator/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // ITProgressIndicator 4 | // 5 | // Created by Ilija Tovilo on 9/25/13. 6 | // Copyright (c) 2013 Ilija Tovilo. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "ITProgressIndicator.h" 11 | 12 | @interface AppDelegate : NSObject 13 | 14 | @property (assign) IBOutlet NSWindow *window; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2013-2015 Ilija Tovilo 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | -------------------------------------------------------------------------------- /ITProgressIndicator/ITProgressIndicator/en.lproj/Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} 2 | {\colortbl;\red255\green255\blue255;} 3 | \paperw9840\paperh8400 4 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural 5 | 6 | \f0\b\fs24 \cf0 Engineering: 7 | \b0 \ 8 | Some people\ 9 | \ 10 | 11 | \b Human Interface Design: 12 | \b0 \ 13 | Some other people\ 14 | \ 15 | 16 | \b Testing: 17 | \b0 \ 18 | Hopefully not nobody\ 19 | \ 20 | 21 | \b Documentation: 22 | \b0 \ 23 | Whoever\ 24 | \ 25 | 26 | \b With special thanks to: 27 | \b0 \ 28 | Mom\ 29 | } 30 | -------------------------------------------------------------------------------- /ITProgressIndicator.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "ITProgressIndicator" 3 | s.version = "0.1" 4 | s.summary = "A replacement class for NSProgressIndicator driven by Core Animation." 5 | s.homepage = "https://github.com/iluuu1994/ITProgressIndicator" 6 | s.social_media_url = "https://twitter.com/ilijatovilo" 7 | 8 | s.license = 'Apache' 9 | s.author = { "Ilija Tovilo" => "support@ilijatovilo.ch" } 10 | 11 | s.platform = :osx 12 | s.source = { :git => "https://github.com/iluuu1994/ITProgressIndicator.git", :tag => "0.1" } 13 | s.source_files = 'ITProgressIndicator/Classes/*.{h,m}' 14 | s.requires_arc = true 15 | end 16 | -------------------------------------------------------------------------------- /ITProgressIndicator/ITProgressIndicatorKit/ITProgressIndicatorKit.h: -------------------------------------------------------------------------------- 1 | // 2 | // ITProgressIndicatorKit.h 3 | // ITProgressIndicatorKit 4 | // 5 | // Created by Matias Piipari on 27/03/2016. 6 | // Copyright © 2016 Ilija Tovilo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for ITProgressIndicatorKit. 12 | FOUNDATION_EXPORT double ITProgressIndicatorKitVersionNumber; 13 | 14 | //! Project version string for ITProgressIndicatorKit. 15 | FOUNDATION_EXPORT const unsigned char ITProgressIndicatorKitVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | #import "ITProgressIndicator.h" 20 | -------------------------------------------------------------------------------- /ITProgressIndicator/ITProgressIndicatorTests/ITProgressIndicatorTests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ch.ilijatovilo.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /ITProgressIndicator/ITProgressIndicatorTests/ITProgressIndicatorTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // ITProgressIndicatorTests.m 3 | // ITProgressIndicatorTests 4 | // 5 | // Created by Ilija Tovilo on 9/25/13. 6 | // Copyright (c) 2013 Ilija Tovilo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ITProgressIndicatorTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation ITProgressIndicatorTests 16 | 17 | - (void)setUp 18 | { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown 24 | { 25 | // Put teardown code here. This method is called after the invocation of each test method in the class. 26 | [super tearDown]; 27 | } 28 | 29 | - (void)testExample 30 | { 31 | XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /ITProgressIndicator/ITProgressIndicatorKit/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 | NSHumanReadableCopyright 24 | Copyright © 2016 Ilija Tovilo. All rights reserved. 25 | NSPrincipalClass 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /ITProgressIndicator/ITProgressIndicator/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "size" : "256x256", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "size" : "512x512", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "size" : "512x512", 51 | "scale" : "2x" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /ITProgressIndicator/ITProgressIndicator/ITProgressIndicator-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | ch.ilijatovilo.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSMinimumSystemVersion 26 | ${MACOSX_DEPLOYMENT_TARGET} 27 | NSHumanReadableCopyright 28 | Copyright © 2013 Ilija Tovilo. All rights reserved. 29 | NSMainNibFile 30 | MainMenu 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /ITProgressIndicator/Classes/ITProgressIndicator.h: -------------------------------------------------------------------------------- 1 | // 2 | // ITProgressIndicatorView.h 3 | // ITProgressIndicator 4 | // 5 | // Created by Ilija Tovilo on 9/25/13. 6 | // Copyright (c) 2013 Ilija Tovilo. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | // 13 | // !!!IMPORTANT!!! - Embedd ITProgressIndicator in a layer-backed view to avoid side-effects! 14 | // 15 | 16 | /** 17 | * @class ITProgressIndicator 18 | * 19 | * A replacement for `NSProgressIndicator`. 20 | * It's a highly customizable control, driven by Core Animation, which makes it much more performant. 21 | * 22 | * So basically, it's awesome. 23 | * 24 | */ 25 | 26 | IB_DESIGNABLE 27 | @interface ITProgressIndicator : NSView 28 | 29 | #pragma mark - Methods 30 | 31 | /** 32 | * Override this method to achieve a custom animation 33 | * 34 | * @return CAKeyframeAnimation - animation which will be put on the progress indicator layer 35 | */ 36 | - (CAKeyframeAnimation *)keyFrameAnimationForCurrentPreferences; 37 | 38 | #pragma mark - Properties 39 | 40 | 41 | /// @property isIndeterminate - Indicates if the view will show the progress, or just spin 42 | @property (nonatomic, setter = setIndeterminate:) BOOL isIndeterminate; 43 | 44 | 45 | /// @property progress - The amount that should be shown when `isIndeterminate` is set to `YES` 46 | @property (nonatomic) IBInspectable CGFloat progress; 47 | 48 | 49 | /// @property animates - Indicates if the view is animating 50 | @property (nonatomic) IBInspectable BOOL animates; 51 | 52 | 53 | /// @property hideWhenStopped - Indicates if the view will be hidden if it's stopped 54 | @property (nonatomic) IBInspectable BOOL hideWhenStopped; 55 | 56 | 57 | /// @property lengthOfLine - The length of a single line 58 | @property (nonatomic) IBInspectable CGFloat lengthOfLine; 59 | 60 | 61 | /// @property widthOfLine - The width of a single line 62 | @property (nonatomic) IBInspectable CGFloat widthOfLine; 63 | 64 | 65 | /// @property numberOfLines - The number of lines of the indicator 66 | @property (nonatomic) IBInspectable NSUInteger numberOfLines; 67 | 68 | 69 | /// @property innerMargin - The distance of the lines from the middle 70 | @property (nonatomic) IBInspectable CGFloat innerMargin; 71 | 72 | 73 | /// @property animationDuration - Duration of a single rotation 74 | @property (nonatomic) IBInspectable CGFloat animationDuration; 75 | 76 | /// @property gradualAnimation - Defines if the animation is smooth or gradual 77 | @property (nonatomic) IBInspectable BOOL steppedAnimation; 78 | 79 | /// @property color - The color of the progress indicator 80 | @property (nonatomic, strong) IBInspectable NSColor *color; 81 | 82 | @end 83 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ITProgressIndicator 2 | =================== 3 | 4 | A replacement class for `NSProgressIndicator` driven by Core Animation. 5 | It's highly customisable and much more efficient than `NSProgressIndicator`. 6 | 7 | `ITProgressInidicator` was created for [Play by Play](http://playbyplayapp.com), development funded by [David Keegan](http://davidkeegan.com). 8 | 9 | ![](./Demo.gif) 10 | 11 | 12 | Usage 13 | ----- 14 | 15 | ### Copy files 16 | 17 | Copy the following files: 18 | 19 | * `ITProgressIndicator.h` 20 | * `ITProgressIndicator.m` 21 | 22 | Make sure to copy them to the project, and to add them to the target. 23 | 24 | 25 | ### Use in a project 26 | 27 | Make sure to check out the sample project. 28 | Simply drag a custom view onto your window and set it's custom class to `ITProgressIndicator`. 29 | 30 | It's advised to embed your progress indicator into a layer-backed view! 31 | Look at the demo application for clarifaction. 32 | 33 | To customise your progress indicator, use the following properties: 34 | 35 | ``` objc 36 | /// @property isIndeterminate - Indicates if the view will show the progress, or just spin 37 | @property (nonatomic, setter = setIndeterminate:) BOOL isIndeterminate; 38 | 39 | /// @property progress - The amount that should be shown when `isIndeterminate` is set to `YES` 40 | @property (nonatomic) CGFloat progress; 41 | 42 | /// @property animates - Indicates if the view is animating 43 | @property (nonatomic) BOOL animates; 44 | 45 | /// @property hideWhenStopped - Indicates if the view will be hidden if it's stopped 46 | @property (nonatomic) BOOL hideWhenStopped; 47 | 48 | /// @property lengthOfLine - The length of a single line 49 | @property (nonatomic) CGFloat lengthOfLine; 50 | 51 | /// @property widthOfLine - The width of a single line 52 | @property (nonatomic) CGFloat widthOfLine; 53 | 54 | /// @property numberOfLines - The number of lines of the indicator 55 | @property (nonatomic) NSUInteger numberOfLines; 56 | 57 | /// @property innerMargin - The distance of the lines from the middle 58 | @property (nonatomic) CGFloat innerMargin; 59 | 60 | /// @property animationDuration - Duration of a single rotation 61 | @property (nonatomic) CGFloat animationDuration; 62 | 63 | /// @property gradualAnimation - Defines if the animation is smooth or gradual 64 | @property (nonatomic) BOOL steppedAnimation; 65 | 66 | /// @property color - The color of the progress indicator 67 | @property (nonatomic, strong) NSColor *color; 68 | ``` 69 | 70 | You can also override the following method to achieve your own custom animation: 71 | 72 | ```objc 73 | /** 74 | * Override this method to achieve a custom animation 75 | * 76 | * @return CAKeyframeAnimation - animation which will be put on the progress indicator layer 77 | */ 78 | - (CAKeyframeAnimation *)keyFrameAnimationForCurrentPreferences; 79 | ``` 80 | -------------------------------------------------------------------------------- /ITProgressIndicator/ITProgressIndicator.xcodeproj/xcshareddata/xcschemes/ITProgressIndicatorKit.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /ITProgressIndicator/Classes/ITProgressIndicator.m: -------------------------------------------------------------------------------- 1 | // 2 | // ITProgressIndicatorView.m 3 | // ITProgressIndicator 4 | // 5 | // Created by Ilija Tovilo on 9/25/13. 6 | // Copyright (c) 2013 Ilija Tovilo. All rights reserved. 7 | // 8 | 9 | #if !__has_feature(objc_arc) 10 | #error ARC needs to be enabled! 11 | #endif 12 | 13 | 14 | #import "ITProgressIndicator.h" 15 | 16 | 17 | #pragma mark - Consts 18 | #define kITSpinAnimationKey @"spinAnimation" 19 | #define kITProgressPropertyKey @"progress" 20 | 21 | 22 | // ---------------------------------------------------------------------------------------- 23 | #pragma mark - NSBezierPath+IT_Geometry 24 | // ---------------------------------------------------------------------------------------- 25 | 26 | @interface NSBezierPath (IT_Geometry) 27 | 28 | - (NSBezierPath*)it_rotatedBezierPath:(float) angle; 29 | - (NSBezierPath*)it_rotatedBezierPath:(float) angle aboutPoint:(NSPoint)point; 30 | 31 | @end 32 | 33 | @implementation NSBezierPath (IT_Geometry) 34 | 35 | - (NSBezierPath *)it_rotatedBezierPath:(float)angle { 36 | return [self it_rotatedBezierPath:angle aboutPoint:NSMakePoint(NSMidX(self.bounds), NSMidY(self.bounds))]; 37 | } 38 | 39 | - (NSBezierPath*)it_rotatedBezierPath:(float)angle aboutPoint:(NSPoint)point { 40 | if(angle == 0.0) return self; 41 | else 42 | { 43 | NSBezierPath* copy = [self copy]; 44 | NSAffineTransform *xfm = [self it_rotationTransformWithAngle:angle aboutPoint:point]; 45 | [copy transformUsingAffineTransform:xfm]; 46 | 47 | return copy; 48 | } 49 | } 50 | 51 | - (NSAffineTransform *)it_rotationTransformWithAngle:(const float)angle aboutPoint:(const NSPoint)aboutPoint { 52 | NSAffineTransform *xfm = [NSAffineTransform transform]; 53 | [xfm translateXBy:aboutPoint.x yBy:aboutPoint.y]; 54 | [xfm rotateByRadians:angle]; 55 | [xfm translateXBy:-aboutPoint.x yBy:-aboutPoint.y]; 56 | 57 | return xfm; 58 | } 59 | 60 | @end 61 | 62 | 63 | 64 | 65 | // ---------------------------------------------------------------------------------------- 66 | #pragma mark - ITProgressIndicator 67 | // ---------------------------------------------------------------------------------------- 68 | 69 | #pragma mark - Private Interface 70 | 71 | @interface ITProgressIndicator () 72 | @property (nonatomic, strong, readonly) CALayer *rootLayer; 73 | @property (nonatomic, strong, readonly) CALayer *progressIndicatorLayer; 74 | @end 75 | 76 | 77 | #pragma mark - Implementation 78 | 79 | @implementation ITProgressIndicator 80 | @synthesize progressIndicatorLayer = _progressIndicatorLayer; 81 | 82 | 83 | #pragma mark - Init 84 | 85 | - (id)initWithCoder:(NSCoder *)coder 86 | { 87 | self = [super initWithCoder:coder]; 88 | if (self) { 89 | [self initLayers]; 90 | } 91 | return self; 92 | } 93 | 94 | - (id)initWithFrame:(NSRect)frame 95 | { 96 | self = [super initWithFrame:frame]; 97 | if (self) { 98 | [self initLayers]; 99 | } 100 | return self; 101 | } 102 | 103 | - (void)initLayers { 104 | // Setting initial values 105 | self.color = [NSColor blackColor]; 106 | self.innerMargin = 4; 107 | self.widthOfLine = 3; 108 | self.lengthOfLine = 6; 109 | self.numberOfLines = 8; 110 | self.animationDuration = 0.6; 111 | self.isIndeterminate = YES; 112 | self.steppedAnimation = YES; 113 | self.hideWhenStopped = YES; 114 | self.animates = YES; 115 | 116 | // Init layers 117 | _rootLayer = [CALayer layer]; 118 | self.layer = _rootLayer; 119 | [self setWantsLayer:YES]; 120 | self.progressIndicatorLayer.frame = _rootLayer.bounds; 121 | [_rootLayer addSublayer:self.progressIndicatorLayer]; 122 | 123 | [self reloadIndicatorContent]; 124 | [self reloadAnimation]; 125 | } 126 | 127 | - (void)awakeFromNib { 128 | [self reloadAnimation]; 129 | } 130 | 131 | - (void)reloadIndicatorContent { 132 | self.progressIndicatorLayer.contents = [self progressImage]; 133 | } 134 | 135 | - (void)reloadAnimation { 136 | [self.progressIndicatorLayer removeAnimationForKey:kITSpinAnimationKey]; 137 | 138 | if (self.animates) { 139 | [self.progressIndicatorLayer addAnimation:[self keyFrameAnimationForCurrentPreferences] forKey:kITSpinAnimationKey]; 140 | } 141 | } 142 | 143 | 144 | #pragma mark - Drawing 145 | 146 | - (NSImage *)progressImage { 147 | NSImage *progressImage = [[NSImage alloc] initWithSize:self.bounds.size]; 148 | [progressImage lockFocus]; 149 | { 150 | [NSGraphicsContext saveGraphicsState]; 151 | { 152 | [self.color set]; 153 | 154 | NSRect r = self.bounds; 155 | NSBezierPath *line = [NSBezierPath bezierPathWithRoundedRect: 156 | NSMakeRect((NSWidth(r) / 2) - (self.widthOfLine / 2), 157 | (NSHeight(r) / 2) - self.innerMargin - self.lengthOfLine, 158 | self.widthOfLine, self.lengthOfLine) 159 | xRadius:self.widthOfLine / 2 160 | yRadius:self.widthOfLine / 2]; 161 | 162 | void (^lineDrawingBlock)(NSUInteger line) = 163 | ^(NSUInteger lineNumber) { 164 | NSBezierPath *lineInstance = [line copy]; 165 | lineInstance = [lineInstance it_rotatedBezierPath:((2 * M_PI) / self.numberOfLines * lineNumber) + M_PI 166 | aboutPoint:NSMakePoint(NSWidth(r) / 2, NSHeight(r) / 2)]; 167 | 168 | if (_isIndeterminate) [[self.color colorWithAlphaComponent:1.0 - (1.0 / self.numberOfLines * lineNumber)] set]; 169 | 170 | [lineInstance fill]; 171 | }; 172 | 173 | if (!self.isIndeterminate) { 174 | for (NSUInteger i = self.numberOfLines; 175 | i > round(self.numberOfLines - (self.numberOfLines * self.progress)); 176 | i--) 177 | { 178 | lineDrawingBlock(i); 179 | } 180 | } else { 181 | for (NSUInteger i = 0; i < self.numberOfLines; i++) { 182 | lineDrawingBlock(i); 183 | } 184 | } 185 | } 186 | [NSGraphicsContext restoreGraphicsState]; 187 | } 188 | [progressImage unlockFocus]; 189 | 190 | return progressImage; 191 | } 192 | 193 | 194 | #pragma mark - Helpers 195 | 196 | - (CAKeyframeAnimation *)keyFrameAnimationForCurrentPreferences { 197 | NSMutableArray* keyFrameValues = [NSMutableArray array]; 198 | NSMutableArray* keyTimeValues; 199 | 200 | if (self.steppedAnimation) { 201 | { 202 | [keyFrameValues addObject:[NSNumber numberWithFloat:0.0]]; 203 | for (NSUInteger i = 0; i < self.numberOfLines; i++) { 204 | [keyFrameValues addObject:[NSNumber numberWithFloat:-M_PI * (2.0 / self.numberOfLines * i)]]; 205 | [keyFrameValues addObject:[NSNumber numberWithFloat:-M_PI * (2.0 / self.numberOfLines * i)]]; 206 | } 207 | [keyFrameValues addObject:[NSNumber numberWithFloat:-M_PI*2.0]]; 208 | } 209 | 210 | keyTimeValues = [NSMutableArray array]; 211 | { 212 | [keyTimeValues addObject:[NSNumber numberWithFloat:0.0]]; 213 | for (NSUInteger i = 0; i < (self.numberOfLines - 1); i++) { 214 | [keyTimeValues addObject:[NSNumber numberWithFloat:1.0 / self.numberOfLines * i]]; 215 | [keyTimeValues addObject:[NSNumber numberWithFloat:1.0 / self.numberOfLines * (i + 1)]]; 216 | } 217 | [keyTimeValues addObject:[NSNumber numberWithFloat:1.0 / self.numberOfLines * (self.numberOfLines - 1)]]; 218 | } 219 | } else { 220 | { 221 | [keyFrameValues addObject:[NSNumber numberWithFloat:-M_PI*0.0]]; 222 | [keyFrameValues addObject:[NSNumber numberWithFloat:-M_PI*0.5]]; 223 | [keyFrameValues addObject:[NSNumber numberWithFloat:-M_PI*1.0]]; 224 | [keyFrameValues addObject:[NSNumber numberWithFloat:-M_PI*1.5]]; 225 | [keyFrameValues addObject:[NSNumber numberWithFloat:-M_PI*2.0]]; 226 | } 227 | } 228 | 229 | 230 | CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; 231 | 232 | [animation setRepeatCount:HUGE_VALF]; 233 | [animation setValues:keyFrameValues]; 234 | [animation setKeyTimes:keyTimeValues]; 235 | [animation setValueFunction:[CAValueFunction functionWithName: kCAValueFunctionRotateZ]]; 236 | [animation setDuration:self.animationDuration]; 237 | [animation setBeginTime: 1]; 238 | 239 | return animation; 240 | } 241 | 242 | - (void)reloadVisibility { 243 | if (_hideWhenStopped && !_animates && _isIndeterminate) { 244 | [self setHidden:YES]; 245 | } else { 246 | [self setHidden:NO]; 247 | } 248 | } 249 | 250 | 251 | #pragma mark - NSView methods 252 | 253 | // Animatible proxy 254 | + (id)defaultAnimationForKey:(NSString *)key 255 | { 256 | if ([key isEqualToString:kITProgressPropertyKey]) { 257 | return [CABasicAnimation animation]; 258 | } else { 259 | return [super defaultAnimationForKey:key]; 260 | } 261 | } 262 | 263 | 264 | #pragma mark - Setters & Getters 265 | 266 | - (void)setIndeterminate:(BOOL)isIndeterminate { 267 | _isIndeterminate = isIndeterminate; 268 | 269 | if (!_isIndeterminate) { 270 | self.animates = NO; 271 | } 272 | } 273 | 274 | - (void)setProgress:(CGFloat)progress { 275 | if (progress < 0 || progress > 1) { 276 | @throw [NSException exceptionWithName:@"Invalid `progress` property value" 277 | reason:@"`progress` property needs to be between 0 and 1" 278 | userInfo:nil]; 279 | } 280 | 281 | _progress = progress; 282 | 283 | if (!self.isIndeterminate) { 284 | [self reloadIndicatorContent]; 285 | } 286 | } 287 | 288 | - (void)setAnimates:(BOOL)animates { 289 | _animates = animates; 290 | [self reloadIndicatorContent]; 291 | [self reloadAnimation]; 292 | [self reloadVisibility]; 293 | } 294 | 295 | - (void)setHideWhenStopped:(BOOL)hideWhenStopped { 296 | _hideWhenStopped = hideWhenStopped; 297 | [self reloadVisibility]; 298 | } 299 | 300 | - (CALayer *)progressIndicatorLayer { 301 | if (!_progressIndicatorLayer) { 302 | _progressIndicatorLayer = [CALayer layer]; 303 | } 304 | 305 | return _progressIndicatorLayer; 306 | } 307 | 308 | - (void)setLengthOfLine:(CGFloat)lengthOfLine { 309 | _lengthOfLine = lengthOfLine; 310 | [self reloadIndicatorContent]; 311 | } 312 | 313 | - (void)setWidthOfLine:(CGFloat)widthOfLine { 314 | _widthOfLine = widthOfLine; 315 | [self reloadIndicatorContent]; 316 | } 317 | 318 | - (void)setInnerMargin:(CGFloat)innerMargin { 319 | _innerMargin = innerMargin; 320 | [self reloadIndicatorContent]; 321 | } 322 | 323 | - (void)setAnimationDuration:(CGFloat)animationDuration { 324 | _animationDuration = animationDuration; 325 | [self reloadAnimation]; 326 | } 327 | 328 | - (void)setNumberOfLines:(NSUInteger)numberOfLines { 329 | _numberOfLines = numberOfLines; 330 | [self reloadIndicatorContent]; 331 | [self reloadAnimation]; 332 | } 333 | 334 | - (void)setSteppedAnimation:(BOOL)steppedAnimation { 335 | _steppedAnimation = steppedAnimation; 336 | [self reloadAnimation]; 337 | } 338 | 339 | - (void)setColor:(NSColor *)color { 340 | _color = color; 341 | [self reloadIndicatorContent]; 342 | } 343 | 344 | @end 345 | -------------------------------------------------------------------------------- /ITProgressIndicator/ITProgressIndicator.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 5F44C08E1CA8437400916663 /* ITProgressIndicatorKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F44C08D1CA8437400916663 /* ITProgressIndicatorKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 5F44C0921CA8437400916663 /* ITProgressIndicatorKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5F44C08B1CA8437400916663 /* ITProgressIndicatorKit.framework */; }; 12 | 5F44C0931CA8437400916663 /* ITProgressIndicatorKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 5F44C08B1CA8437400916663 /* ITProgressIndicatorKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 13 | 5F44C0981CA8437D00916663 /* ITProgressIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 91F8246817F4CA3900371819 /* ITProgressIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; }; 14 | 5F44C0991CA8437D00916663 /* ITProgressIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 91F8246917F4CA3900371819 /* ITProgressIndicator.m */; }; 15 | 91F498B717F38F12007CBE92 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 91F498B617F38F12007CBE92 /* Cocoa.framework */; }; 16 | 91F498C117F38F12007CBE92 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 91F498BF17F38F12007CBE92 /* InfoPlist.strings */; }; 17 | 91F498C317F38F12007CBE92 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 91F498C217F38F12007CBE92 /* main.m */; }; 18 | 91F498C717F38F12007CBE92 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 91F498C517F38F12007CBE92 /* Credits.rtf */; }; 19 | 91F498CA17F38F12007CBE92 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 91F498C917F38F12007CBE92 /* AppDelegate.m */; }; 20 | 91F498CD17F38F12007CBE92 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 91F498CB17F38F12007CBE92 /* MainMenu.xib */; }; 21 | 91F498CF17F38F12007CBE92 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 91F498CE17F38F12007CBE92 /* Images.xcassets */; }; 22 | 91F498D617F38F12007CBE92 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 91F498D517F38F12007CBE92 /* XCTest.framework */; }; 23 | 91F498D717F38F12007CBE92 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 91F498B617F38F12007CBE92 /* Cocoa.framework */; }; 24 | 91F498DF17F38F12007CBE92 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 91F498DD17F38F12007CBE92 /* InfoPlist.strings */; }; 25 | 91F498E117F38F12007CBE92 /* ITProgressIndicatorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 91F498E017F38F12007CBE92 /* ITProgressIndicatorTests.m */; }; 26 | 91F5AD8417F4529500393596 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 91F5AD8317F4529400393596 /* QuartzCore.framework */; }; 27 | 91F8246C17F4CA3900371819 /* ITProgressIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 91F8246917F4CA3900371819 /* ITProgressIndicator.m */; }; 28 | /* End PBXBuildFile section */ 29 | 30 | /* Begin PBXContainerItemProxy section */ 31 | 5F44C0901CA8437400916663 /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = 91F498AB17F38F12007CBE92 /* Project object */; 34 | proxyType = 1; 35 | remoteGlobalIDString = 5F44C08A1CA8437400916663; 36 | remoteInfo = ITProgressIndicatorKit; 37 | }; 38 | 91F498D817F38F12007CBE92 /* PBXContainerItemProxy */ = { 39 | isa = PBXContainerItemProxy; 40 | containerPortal = 91F498AB17F38F12007CBE92 /* Project object */; 41 | proxyType = 1; 42 | remoteGlobalIDString = 91F498B217F38F12007CBE92; 43 | remoteInfo = ITProgressIndicator; 44 | }; 45 | /* End PBXContainerItemProxy section */ 46 | 47 | /* Begin PBXCopyFilesBuildPhase section */ 48 | 5F44C0971CA8437400916663 /* Embed Frameworks */ = { 49 | isa = PBXCopyFilesBuildPhase; 50 | buildActionMask = 2147483647; 51 | dstPath = ""; 52 | dstSubfolderSpec = 10; 53 | files = ( 54 | 5F44C0931CA8437400916663 /* ITProgressIndicatorKit.framework in Embed Frameworks */, 55 | ); 56 | name = "Embed Frameworks"; 57 | runOnlyForDeploymentPostprocessing = 0; 58 | }; 59 | /* End PBXCopyFilesBuildPhase section */ 60 | 61 | /* Begin PBXFileReference section */ 62 | 5F44C08B1CA8437400916663 /* ITProgressIndicatorKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ITProgressIndicatorKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 63 | 5F44C08D1CA8437400916663 /* ITProgressIndicatorKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ITProgressIndicatorKit.h; sourceTree = ""; }; 64 | 5F44C08F1CA8437400916663 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 65 | 91F498B317F38F12007CBE92 /* ITProgressIndicator.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ITProgressIndicator.app; sourceTree = BUILT_PRODUCTS_DIR; }; 66 | 91F498B617F38F12007CBE92 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 67 | 91F498B917F38F12007CBE92 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 68 | 91F498BA17F38F12007CBE92 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 69 | 91F498BB17F38F12007CBE92 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 70 | 91F498BE17F38F12007CBE92 /* ITProgressIndicator-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ITProgressIndicator-Info.plist"; sourceTree = ""; }; 71 | 91F498C017F38F12007CBE92 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 72 | 91F498C217F38F12007CBE92 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 73 | 91F498C417F38F12007CBE92 /* ITProgressIndicator-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ITProgressIndicator-Prefix.pch"; sourceTree = ""; }; 74 | 91F498C617F38F12007CBE92 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; 75 | 91F498C817F38F12007CBE92 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 76 | 91F498C917F38F12007CBE92 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 77 | 91F498CC17F38F12007CBE92 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 78 | 91F498CE17F38F12007CBE92 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 79 | 91F498D417F38F12007CBE92 /* ITProgressIndicatorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ITProgressIndicatorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 80 | 91F498D517F38F12007CBE92 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 81 | 91F498DC17F38F12007CBE92 /* ITProgressIndicatorTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ITProgressIndicatorTests-Info.plist"; sourceTree = ""; }; 82 | 91F498DE17F38F12007CBE92 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 83 | 91F498E017F38F12007CBE92 /* ITProgressIndicatorTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ITProgressIndicatorTests.m; sourceTree = ""; }; 84 | 91F5AD8317F4529400393596 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 85 | 91F8246817F4CA3900371819 /* ITProgressIndicator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ITProgressIndicator.h; path = Classes/ITProgressIndicator.h; sourceTree = SOURCE_ROOT; }; 86 | 91F8246917F4CA3900371819 /* ITProgressIndicator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ITProgressIndicator.m; path = Classes/ITProgressIndicator.m; sourceTree = SOURCE_ROOT; }; 87 | /* End PBXFileReference section */ 88 | 89 | /* Begin PBXFrameworksBuildPhase section */ 90 | 5F44C0871CA8437400916663 /* Frameworks */ = { 91 | isa = PBXFrameworksBuildPhase; 92 | buildActionMask = 2147483647; 93 | files = ( 94 | ); 95 | runOnlyForDeploymentPostprocessing = 0; 96 | }; 97 | 91F498B017F38F12007CBE92 /* Frameworks */ = { 98 | isa = PBXFrameworksBuildPhase; 99 | buildActionMask = 2147483647; 100 | files = ( 101 | 5F44C0921CA8437400916663 /* ITProgressIndicatorKit.framework in Frameworks */, 102 | 91F5AD8417F4529500393596 /* QuartzCore.framework in Frameworks */, 103 | 91F498B717F38F12007CBE92 /* Cocoa.framework in Frameworks */, 104 | ); 105 | runOnlyForDeploymentPostprocessing = 0; 106 | }; 107 | 91F498D117F38F12007CBE92 /* Frameworks */ = { 108 | isa = PBXFrameworksBuildPhase; 109 | buildActionMask = 2147483647; 110 | files = ( 111 | 91F498D717F38F12007CBE92 /* Cocoa.framework in Frameworks */, 112 | 91F498D617F38F12007CBE92 /* XCTest.framework in Frameworks */, 113 | ); 114 | runOnlyForDeploymentPostprocessing = 0; 115 | }; 116 | /* End PBXFrameworksBuildPhase section */ 117 | 118 | /* Begin PBXGroup section */ 119 | 5F44C08C1CA8437400916663 /* ITProgressIndicatorKit */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | 5F44C08D1CA8437400916663 /* ITProgressIndicatorKit.h */, 123 | 5F44C08F1CA8437400916663 /* Info.plist */, 124 | ); 125 | path = ITProgressIndicatorKit; 126 | sourceTree = ""; 127 | }; 128 | 91C79D6217F4A74700182F0D /* ITProgressIndicator */ = { 129 | isa = PBXGroup; 130 | children = ( 131 | 91F8246817F4CA3900371819 /* ITProgressIndicator.h */, 132 | 91F8246917F4CA3900371819 /* ITProgressIndicator.m */, 133 | ); 134 | name = ITProgressIndicator; 135 | sourceTree = ""; 136 | }; 137 | 91F498AA17F38F12007CBE92 = { 138 | isa = PBXGroup; 139 | children = ( 140 | 91F498BC17F38F12007CBE92 /* ITProgressIndicator */, 141 | 91F498DA17F38F12007CBE92 /* ITProgressIndicatorTests */, 142 | 5F44C08C1CA8437400916663 /* ITProgressIndicatorKit */, 143 | 91F498B517F38F12007CBE92 /* Frameworks */, 144 | 91F498B417F38F12007CBE92 /* Products */, 145 | ); 146 | sourceTree = ""; 147 | }; 148 | 91F498B417F38F12007CBE92 /* Products */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | 91F498B317F38F12007CBE92 /* ITProgressIndicator.app */, 152 | 91F498D417F38F12007CBE92 /* ITProgressIndicatorTests.xctest */, 153 | 5F44C08B1CA8437400916663 /* ITProgressIndicatorKit.framework */, 154 | ); 155 | name = Products; 156 | sourceTree = ""; 157 | }; 158 | 91F498B517F38F12007CBE92 /* Frameworks */ = { 159 | isa = PBXGroup; 160 | children = ( 161 | 91F5AD8317F4529400393596 /* QuartzCore.framework */, 162 | 91F498B617F38F12007CBE92 /* Cocoa.framework */, 163 | 91F498D517F38F12007CBE92 /* XCTest.framework */, 164 | 91F498B817F38F12007CBE92 /* Other Frameworks */, 165 | ); 166 | name = Frameworks; 167 | sourceTree = ""; 168 | }; 169 | 91F498B817F38F12007CBE92 /* Other Frameworks */ = { 170 | isa = PBXGroup; 171 | children = ( 172 | 91F498B917F38F12007CBE92 /* AppKit.framework */, 173 | 91F498BA17F38F12007CBE92 /* CoreData.framework */, 174 | 91F498BB17F38F12007CBE92 /* Foundation.framework */, 175 | ); 176 | name = "Other Frameworks"; 177 | sourceTree = ""; 178 | }; 179 | 91F498BC17F38F12007CBE92 /* ITProgressIndicator */ = { 180 | isa = PBXGroup; 181 | children = ( 182 | 91C79D6217F4A74700182F0D /* ITProgressIndicator */, 183 | 91F498C817F38F12007CBE92 /* AppDelegate.h */, 184 | 91F498C917F38F12007CBE92 /* AppDelegate.m */, 185 | 91F498CB17F38F12007CBE92 /* MainMenu.xib */, 186 | 91F498CE17F38F12007CBE92 /* Images.xcassets */, 187 | 91F498BD17F38F12007CBE92 /* Supporting Files */, 188 | ); 189 | path = ITProgressIndicator; 190 | sourceTree = ""; 191 | }; 192 | 91F498BD17F38F12007CBE92 /* Supporting Files */ = { 193 | isa = PBXGroup; 194 | children = ( 195 | 91F498BE17F38F12007CBE92 /* ITProgressIndicator-Info.plist */, 196 | 91F498BF17F38F12007CBE92 /* InfoPlist.strings */, 197 | 91F498C217F38F12007CBE92 /* main.m */, 198 | 91F498C417F38F12007CBE92 /* ITProgressIndicator-Prefix.pch */, 199 | 91F498C517F38F12007CBE92 /* Credits.rtf */, 200 | ); 201 | name = "Supporting Files"; 202 | sourceTree = ""; 203 | }; 204 | 91F498DA17F38F12007CBE92 /* ITProgressIndicatorTests */ = { 205 | isa = PBXGroup; 206 | children = ( 207 | 91F498E017F38F12007CBE92 /* ITProgressIndicatorTests.m */, 208 | 91F498DB17F38F12007CBE92 /* Supporting Files */, 209 | ); 210 | path = ITProgressIndicatorTests; 211 | sourceTree = ""; 212 | }; 213 | 91F498DB17F38F12007CBE92 /* Supporting Files */ = { 214 | isa = PBXGroup; 215 | children = ( 216 | 91F498DC17F38F12007CBE92 /* ITProgressIndicatorTests-Info.plist */, 217 | 91F498DD17F38F12007CBE92 /* InfoPlist.strings */, 218 | ); 219 | name = "Supporting Files"; 220 | sourceTree = ""; 221 | }; 222 | /* End PBXGroup section */ 223 | 224 | /* Begin PBXHeadersBuildPhase section */ 225 | 5F44C0881CA8437400916663 /* Headers */ = { 226 | isa = PBXHeadersBuildPhase; 227 | buildActionMask = 2147483647; 228 | files = ( 229 | 5F44C0981CA8437D00916663 /* ITProgressIndicator.h in Headers */, 230 | 5F44C08E1CA8437400916663 /* ITProgressIndicatorKit.h in Headers */, 231 | ); 232 | runOnlyForDeploymentPostprocessing = 0; 233 | }; 234 | /* End PBXHeadersBuildPhase section */ 235 | 236 | /* Begin PBXNativeTarget section */ 237 | 5F44C08A1CA8437400916663 /* ITProgressIndicatorKit */ = { 238 | isa = PBXNativeTarget; 239 | buildConfigurationList = 5F44C0961CA8437400916663 /* Build configuration list for PBXNativeTarget "ITProgressIndicatorKit" */; 240 | buildPhases = ( 241 | 5F44C0861CA8437400916663 /* Sources */, 242 | 5F44C0871CA8437400916663 /* Frameworks */, 243 | 5F44C0881CA8437400916663 /* Headers */, 244 | 5F44C0891CA8437400916663 /* Resources */, 245 | ); 246 | buildRules = ( 247 | ); 248 | dependencies = ( 249 | ); 250 | name = ITProgressIndicatorKit; 251 | productName = ITProgressIndicatorKit; 252 | productReference = 5F44C08B1CA8437400916663 /* ITProgressIndicatorKit.framework */; 253 | productType = "com.apple.product-type.framework"; 254 | }; 255 | 91F498B217F38F12007CBE92 /* ITProgressIndicator */ = { 256 | isa = PBXNativeTarget; 257 | buildConfigurationList = 91F498E417F38F12007CBE92 /* Build configuration list for PBXNativeTarget "ITProgressIndicator" */; 258 | buildPhases = ( 259 | 91F498AF17F38F12007CBE92 /* Sources */, 260 | 91F498B017F38F12007CBE92 /* Frameworks */, 261 | 91F498B117F38F12007CBE92 /* Resources */, 262 | 5F44C0971CA8437400916663 /* Embed Frameworks */, 263 | ); 264 | buildRules = ( 265 | ); 266 | dependencies = ( 267 | 5F44C0911CA8437400916663 /* PBXTargetDependency */, 268 | ); 269 | name = ITProgressIndicator; 270 | productName = ITProgressIndicator; 271 | productReference = 91F498B317F38F12007CBE92 /* ITProgressIndicator.app */; 272 | productType = "com.apple.product-type.application"; 273 | }; 274 | 91F498D317F38F12007CBE92 /* ITProgressIndicatorTests */ = { 275 | isa = PBXNativeTarget; 276 | buildConfigurationList = 91F498E717F38F12007CBE92 /* Build configuration list for PBXNativeTarget "ITProgressIndicatorTests" */; 277 | buildPhases = ( 278 | 91F498D017F38F12007CBE92 /* Sources */, 279 | 91F498D117F38F12007CBE92 /* Frameworks */, 280 | 91F498D217F38F12007CBE92 /* Resources */, 281 | ); 282 | buildRules = ( 283 | ); 284 | dependencies = ( 285 | 91F498D917F38F12007CBE92 /* PBXTargetDependency */, 286 | ); 287 | name = ITProgressIndicatorTests; 288 | productName = ITProgressIndicatorTests; 289 | productReference = 91F498D417F38F12007CBE92 /* ITProgressIndicatorTests.xctest */; 290 | productType = "com.apple.product-type.bundle.unit-test"; 291 | }; 292 | /* End PBXNativeTarget section */ 293 | 294 | /* Begin PBXProject section */ 295 | 91F498AB17F38F12007CBE92 /* Project object */ = { 296 | isa = PBXProject; 297 | attributes = { 298 | LastUpgradeCheck = 0500; 299 | ORGANIZATIONNAME = "Ilija Tovilo"; 300 | TargetAttributes = { 301 | 5F44C08A1CA8437400916663 = { 302 | CreatedOnToolsVersion = 7.3; 303 | }; 304 | 91F498D317F38F12007CBE92 = { 305 | TestTargetID = 91F498B217F38F12007CBE92; 306 | }; 307 | }; 308 | }; 309 | buildConfigurationList = 91F498AE17F38F12007CBE92 /* Build configuration list for PBXProject "ITProgressIndicator" */; 310 | compatibilityVersion = "Xcode 3.2"; 311 | developmentRegion = English; 312 | hasScannedForEncodings = 0; 313 | knownRegions = ( 314 | en, 315 | Base, 316 | ); 317 | mainGroup = 91F498AA17F38F12007CBE92; 318 | productRefGroup = 91F498B417F38F12007CBE92 /* Products */; 319 | projectDirPath = ""; 320 | projectRoot = ""; 321 | targets = ( 322 | 91F498B217F38F12007CBE92 /* ITProgressIndicator */, 323 | 91F498D317F38F12007CBE92 /* ITProgressIndicatorTests */, 324 | 5F44C08A1CA8437400916663 /* ITProgressIndicatorKit */, 325 | ); 326 | }; 327 | /* End PBXProject section */ 328 | 329 | /* Begin PBXResourcesBuildPhase section */ 330 | 5F44C0891CA8437400916663 /* Resources */ = { 331 | isa = PBXResourcesBuildPhase; 332 | buildActionMask = 2147483647; 333 | files = ( 334 | ); 335 | runOnlyForDeploymentPostprocessing = 0; 336 | }; 337 | 91F498B117F38F12007CBE92 /* Resources */ = { 338 | isa = PBXResourcesBuildPhase; 339 | buildActionMask = 2147483647; 340 | files = ( 341 | 91F498C117F38F12007CBE92 /* InfoPlist.strings in Resources */, 342 | 91F498CF17F38F12007CBE92 /* Images.xcassets in Resources */, 343 | 91F498C717F38F12007CBE92 /* Credits.rtf in Resources */, 344 | 91F498CD17F38F12007CBE92 /* MainMenu.xib in Resources */, 345 | ); 346 | runOnlyForDeploymentPostprocessing = 0; 347 | }; 348 | 91F498D217F38F12007CBE92 /* Resources */ = { 349 | isa = PBXResourcesBuildPhase; 350 | buildActionMask = 2147483647; 351 | files = ( 352 | 91F498DF17F38F12007CBE92 /* InfoPlist.strings in Resources */, 353 | ); 354 | runOnlyForDeploymentPostprocessing = 0; 355 | }; 356 | /* End PBXResourcesBuildPhase section */ 357 | 358 | /* Begin PBXSourcesBuildPhase section */ 359 | 5F44C0861CA8437400916663 /* Sources */ = { 360 | isa = PBXSourcesBuildPhase; 361 | buildActionMask = 2147483647; 362 | files = ( 363 | 5F44C0991CA8437D00916663 /* ITProgressIndicator.m in Sources */, 364 | ); 365 | runOnlyForDeploymentPostprocessing = 0; 366 | }; 367 | 91F498AF17F38F12007CBE92 /* Sources */ = { 368 | isa = PBXSourcesBuildPhase; 369 | buildActionMask = 2147483647; 370 | files = ( 371 | 91F498CA17F38F12007CBE92 /* AppDelegate.m in Sources */, 372 | 91F498C317F38F12007CBE92 /* main.m in Sources */, 373 | 91F8246C17F4CA3900371819 /* ITProgressIndicator.m in Sources */, 374 | ); 375 | runOnlyForDeploymentPostprocessing = 0; 376 | }; 377 | 91F498D017F38F12007CBE92 /* Sources */ = { 378 | isa = PBXSourcesBuildPhase; 379 | buildActionMask = 2147483647; 380 | files = ( 381 | 91F498E117F38F12007CBE92 /* ITProgressIndicatorTests.m in Sources */, 382 | ); 383 | runOnlyForDeploymentPostprocessing = 0; 384 | }; 385 | /* End PBXSourcesBuildPhase section */ 386 | 387 | /* Begin PBXTargetDependency section */ 388 | 5F44C0911CA8437400916663 /* PBXTargetDependency */ = { 389 | isa = PBXTargetDependency; 390 | target = 5F44C08A1CA8437400916663 /* ITProgressIndicatorKit */; 391 | targetProxy = 5F44C0901CA8437400916663 /* PBXContainerItemProxy */; 392 | }; 393 | 91F498D917F38F12007CBE92 /* PBXTargetDependency */ = { 394 | isa = PBXTargetDependency; 395 | target = 91F498B217F38F12007CBE92 /* ITProgressIndicator */; 396 | targetProxy = 91F498D817F38F12007CBE92 /* PBXContainerItemProxy */; 397 | }; 398 | /* End PBXTargetDependency section */ 399 | 400 | /* Begin PBXVariantGroup section */ 401 | 91F498BF17F38F12007CBE92 /* InfoPlist.strings */ = { 402 | isa = PBXVariantGroup; 403 | children = ( 404 | 91F498C017F38F12007CBE92 /* en */, 405 | ); 406 | name = InfoPlist.strings; 407 | sourceTree = ""; 408 | }; 409 | 91F498C517F38F12007CBE92 /* Credits.rtf */ = { 410 | isa = PBXVariantGroup; 411 | children = ( 412 | 91F498C617F38F12007CBE92 /* en */, 413 | ); 414 | name = Credits.rtf; 415 | sourceTree = ""; 416 | }; 417 | 91F498CB17F38F12007CBE92 /* MainMenu.xib */ = { 418 | isa = PBXVariantGroup; 419 | children = ( 420 | 91F498CC17F38F12007CBE92 /* Base */, 421 | ); 422 | name = MainMenu.xib; 423 | sourceTree = ""; 424 | }; 425 | 91F498DD17F38F12007CBE92 /* InfoPlist.strings */ = { 426 | isa = PBXVariantGroup; 427 | children = ( 428 | 91F498DE17F38F12007CBE92 /* en */, 429 | ); 430 | name = InfoPlist.strings; 431 | sourceTree = ""; 432 | }; 433 | /* End PBXVariantGroup section */ 434 | 435 | /* Begin XCBuildConfiguration section */ 436 | 5F44C0941CA8437400916663 /* Debug */ = { 437 | isa = XCBuildConfiguration; 438 | buildSettings = { 439 | CLANG_ANALYZER_NONNULL = YES; 440 | CLANG_ENABLE_MODULES = YES; 441 | CLANG_WARN_UNREACHABLE_CODE = YES; 442 | CODE_SIGN_IDENTITY = "-"; 443 | COMBINE_HIDPI_IMAGES = YES; 444 | CURRENT_PROJECT_VERSION = 1; 445 | DEBUG_INFORMATION_FORMAT = dwarf; 446 | DEFINES_MODULE = YES; 447 | DYLIB_COMPATIBILITY_VERSION = 1; 448 | DYLIB_CURRENT_VERSION = 1; 449 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 450 | ENABLE_STRICT_OBJC_MSGSEND = YES; 451 | ENABLE_TESTABILITY = YES; 452 | FRAMEWORK_VERSION = A; 453 | GCC_NO_COMMON_BLOCKS = YES; 454 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 455 | INFOPLIST_FILE = ITProgressIndicatorKit/Info.plist; 456 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 457 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 458 | MACOSX_DEPLOYMENT_TARGET = 10.11; 459 | MTL_ENABLE_DEBUG_INFO = YES; 460 | PRODUCT_BUNDLE_IDENTIFIER = com.manuscriptsapp.ITProgressIndicatorKit; 461 | PRODUCT_NAME = "$(TARGET_NAME)"; 462 | SKIP_INSTALL = YES; 463 | VERSIONING_SYSTEM = "apple-generic"; 464 | VERSION_INFO_PREFIX = ""; 465 | }; 466 | name = Debug; 467 | }; 468 | 5F44C0951CA8437400916663 /* Release */ = { 469 | isa = XCBuildConfiguration; 470 | buildSettings = { 471 | CLANG_ANALYZER_NONNULL = YES; 472 | CLANG_ENABLE_MODULES = YES; 473 | CLANG_WARN_UNREACHABLE_CODE = YES; 474 | CODE_SIGN_IDENTITY = "-"; 475 | COMBINE_HIDPI_IMAGES = YES; 476 | COPY_PHASE_STRIP = NO; 477 | CURRENT_PROJECT_VERSION = 1; 478 | DEFINES_MODULE = YES; 479 | DYLIB_COMPATIBILITY_VERSION = 1; 480 | DYLIB_CURRENT_VERSION = 1; 481 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 482 | ENABLE_STRICT_OBJC_MSGSEND = YES; 483 | FRAMEWORK_VERSION = A; 484 | GCC_NO_COMMON_BLOCKS = YES; 485 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 486 | INFOPLIST_FILE = ITProgressIndicatorKit/Info.plist; 487 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 488 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 489 | MACOSX_DEPLOYMENT_TARGET = 10.11; 490 | MTL_ENABLE_DEBUG_INFO = NO; 491 | PRODUCT_BUNDLE_IDENTIFIER = com.manuscriptsapp.ITProgressIndicatorKit; 492 | PRODUCT_NAME = "$(TARGET_NAME)"; 493 | SKIP_INSTALL = YES; 494 | VERSIONING_SYSTEM = "apple-generic"; 495 | VERSION_INFO_PREFIX = ""; 496 | }; 497 | name = Release; 498 | }; 499 | 91F498E217F38F12007CBE92 /* Debug */ = { 500 | isa = XCBuildConfiguration; 501 | buildSettings = { 502 | ALWAYS_SEARCH_USER_PATHS = NO; 503 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 504 | CLANG_CXX_LIBRARY = "libc++"; 505 | CLANG_ENABLE_OBJC_ARC = YES; 506 | CLANG_WARN_BOOL_CONVERSION = YES; 507 | CLANG_WARN_CONSTANT_CONVERSION = YES; 508 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 509 | CLANG_WARN_EMPTY_BODY = YES; 510 | CLANG_WARN_ENUM_CONVERSION = YES; 511 | CLANG_WARN_INT_CONVERSION = YES; 512 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 513 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 514 | COPY_PHASE_STRIP = NO; 515 | GCC_C_LANGUAGE_STANDARD = gnu99; 516 | GCC_DYNAMIC_NO_PIC = NO; 517 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 518 | GCC_OPTIMIZATION_LEVEL = 0; 519 | GCC_PREPROCESSOR_DEFINITIONS = ( 520 | "DEBUG=1", 521 | "$(inherited)", 522 | ); 523 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 524 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 525 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 526 | GCC_WARN_UNDECLARED_SELECTOR = YES; 527 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 528 | GCC_WARN_UNUSED_FUNCTION = YES; 529 | GCC_WARN_UNUSED_VARIABLE = YES; 530 | MACOSX_DEPLOYMENT_TARGET = 10.8; 531 | ONLY_ACTIVE_ARCH = YES; 532 | SDKROOT = macosx; 533 | }; 534 | name = Debug; 535 | }; 536 | 91F498E317F38F12007CBE92 /* Release */ = { 537 | isa = XCBuildConfiguration; 538 | buildSettings = { 539 | ALWAYS_SEARCH_USER_PATHS = NO; 540 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 541 | CLANG_CXX_LIBRARY = "libc++"; 542 | CLANG_ENABLE_OBJC_ARC = YES; 543 | CLANG_WARN_BOOL_CONVERSION = YES; 544 | CLANG_WARN_CONSTANT_CONVERSION = YES; 545 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 546 | CLANG_WARN_EMPTY_BODY = YES; 547 | CLANG_WARN_ENUM_CONVERSION = YES; 548 | CLANG_WARN_INT_CONVERSION = YES; 549 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 550 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 551 | COPY_PHASE_STRIP = YES; 552 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 553 | ENABLE_NS_ASSERTIONS = NO; 554 | GCC_C_LANGUAGE_STANDARD = gnu99; 555 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 556 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 557 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 558 | GCC_WARN_UNDECLARED_SELECTOR = YES; 559 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 560 | GCC_WARN_UNUSED_FUNCTION = YES; 561 | GCC_WARN_UNUSED_VARIABLE = YES; 562 | MACOSX_DEPLOYMENT_TARGET = 10.8; 563 | SDKROOT = macosx; 564 | }; 565 | name = Release; 566 | }; 567 | 91F498E517F38F12007CBE92 /* Debug */ = { 568 | isa = XCBuildConfiguration; 569 | buildSettings = { 570 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 571 | CODE_SIGN_IDENTITY = "-"; 572 | COMBINE_HIDPI_IMAGES = YES; 573 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 574 | GCC_PREFIX_HEADER = "ITProgressIndicator/ITProgressIndicator-Prefix.pch"; 575 | INFOPLIST_FILE = "ITProgressIndicator/ITProgressIndicator-Info.plist"; 576 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 577 | PRODUCT_NAME = "$(TARGET_NAME)"; 578 | WRAPPER_EXTENSION = app; 579 | }; 580 | name = Debug; 581 | }; 582 | 91F498E617F38F12007CBE92 /* Release */ = { 583 | isa = XCBuildConfiguration; 584 | buildSettings = { 585 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 586 | CODE_SIGN_IDENTITY = "-"; 587 | COMBINE_HIDPI_IMAGES = YES; 588 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 589 | GCC_PREFIX_HEADER = "ITProgressIndicator/ITProgressIndicator-Prefix.pch"; 590 | INFOPLIST_FILE = "ITProgressIndicator/ITProgressIndicator-Info.plist"; 591 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 592 | PRODUCT_NAME = "$(TARGET_NAME)"; 593 | WRAPPER_EXTENSION = app; 594 | }; 595 | name = Release; 596 | }; 597 | 91F498E817F38F12007CBE92 /* Debug */ = { 598 | isa = XCBuildConfiguration; 599 | buildSettings = { 600 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/ITProgressIndicator.app/Contents/MacOS/ITProgressIndicator"; 601 | COMBINE_HIDPI_IMAGES = YES; 602 | DEFINES_MODULE = YES; 603 | FRAMEWORK_SEARCH_PATHS = ( 604 | "$(DEVELOPER_FRAMEWORKS_DIR)", 605 | "$(inherited)", 606 | ); 607 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 608 | GCC_PREFIX_HEADER = "ITProgressIndicator/ITProgressIndicator-Prefix.pch"; 609 | GCC_PREPROCESSOR_DEFINITIONS = ( 610 | "DEBUG=1", 611 | "$(inherited)", 612 | ); 613 | INFOPLIST_FILE = "ITProgressIndicatorTests/ITProgressIndicatorTests-Info.plist"; 614 | PRODUCT_NAME = "$(TARGET_NAME)"; 615 | TEST_HOST = "$(BUNDLE_LOADER)"; 616 | WRAPPER_EXTENSION = xctest; 617 | }; 618 | name = Debug; 619 | }; 620 | 91F498E917F38F12007CBE92 /* Release */ = { 621 | isa = XCBuildConfiguration; 622 | buildSettings = { 623 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/ITProgressIndicator.app/Contents/MacOS/ITProgressIndicator"; 624 | COMBINE_HIDPI_IMAGES = YES; 625 | DEFINES_MODULE = YES; 626 | FRAMEWORK_SEARCH_PATHS = ( 627 | "$(DEVELOPER_FRAMEWORKS_DIR)", 628 | "$(inherited)", 629 | ); 630 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 631 | GCC_PREFIX_HEADER = "ITProgressIndicator/ITProgressIndicator-Prefix.pch"; 632 | INFOPLIST_FILE = "ITProgressIndicatorTests/ITProgressIndicatorTests-Info.plist"; 633 | PRODUCT_NAME = "$(TARGET_NAME)"; 634 | TEST_HOST = "$(BUNDLE_LOADER)"; 635 | WRAPPER_EXTENSION = xctest; 636 | }; 637 | name = Release; 638 | }; 639 | /* End XCBuildConfiguration section */ 640 | 641 | /* Begin XCConfigurationList section */ 642 | 5F44C0961CA8437400916663 /* Build configuration list for PBXNativeTarget "ITProgressIndicatorKit" */ = { 643 | isa = XCConfigurationList; 644 | buildConfigurations = ( 645 | 5F44C0941CA8437400916663 /* Debug */, 646 | 5F44C0951CA8437400916663 /* Release */, 647 | ); 648 | defaultConfigurationIsVisible = 0; 649 | defaultConfigurationName = Release; 650 | }; 651 | 91F498AE17F38F12007CBE92 /* Build configuration list for PBXProject "ITProgressIndicator" */ = { 652 | isa = XCConfigurationList; 653 | buildConfigurations = ( 654 | 91F498E217F38F12007CBE92 /* Debug */, 655 | 91F498E317F38F12007CBE92 /* Release */, 656 | ); 657 | defaultConfigurationIsVisible = 0; 658 | defaultConfigurationName = Release; 659 | }; 660 | 91F498E417F38F12007CBE92 /* Build configuration list for PBXNativeTarget "ITProgressIndicator" */ = { 661 | isa = XCConfigurationList; 662 | buildConfigurations = ( 663 | 91F498E517F38F12007CBE92 /* Debug */, 664 | 91F498E617F38F12007CBE92 /* Release */, 665 | ); 666 | defaultConfigurationIsVisible = 0; 667 | defaultConfigurationName = Release; 668 | }; 669 | 91F498E717F38F12007CBE92 /* Build configuration list for PBXNativeTarget "ITProgressIndicatorTests" */ = { 670 | isa = XCConfigurationList; 671 | buildConfigurations = ( 672 | 91F498E817F38F12007CBE92 /* Debug */, 673 | 91F498E917F38F12007CBE92 /* Release */, 674 | ); 675 | defaultConfigurationIsVisible = 0; 676 | defaultConfigurationName = Release; 677 | }; 678 | /* End XCConfigurationList section */ 679 | }; 680 | rootObject = 91F498AB17F38F12007CBE92 /* Project object */; 681 | } 682 | --------------------------------------------------------------------------------