├── .DS_Store ├── JhDownProgressView ├── Assets.xcassets │ ├── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── ViewController.h ├── AppDelegate.h ├── main.m ├── JhDownProgressView.h ├── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.storyboard ├── Info.plist ├── AppDelegate.m ├── ViewController.m └── JhDownProgressView.m ├── JhDownProgressView.xcodeproj ├── xcuserdata │ ├── jh.xcuserdatad │ │ ├── xcdebugger │ │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ │ └── xcschememanagement.plist │ └── lantongmac.xcuserdatad │ │ └── xcschemes │ │ └── xcschememanagement.plist ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcuserdata │ │ ├── jh.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ │ └── lantongmac.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── project.pbxproj ├── JhDownProgressViewTests ├── Info.plist └── JhDownProgressViewTests.m ├── JhDownProgressViewUITests ├── Info.plist └── JhDownProgressViewUITests.m └── README.md /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotjin/JhDownProgressView/HEAD/.DS_Store -------------------------------------------------------------------------------- /JhDownProgressView/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /JhDownProgressView.xcodeproj/xcuserdata/jh.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /JhDownProgressView.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /JhDownProgressView.xcodeproj/project.xcworkspace/xcuserdata/jh.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotjin/JhDownProgressView/HEAD/JhDownProgressView.xcodeproj/project.xcworkspace/xcuserdata/jh.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /JhDownProgressView.xcodeproj/project.xcworkspace/xcuserdata/lantongmac.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iotjin/JhDownProgressView/HEAD/JhDownProgressView.xcodeproj/project.xcworkspace/xcuserdata/lantongmac.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /JhDownProgressView/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // JhDownProgressView 4 | // 5 | // Created by Jh on 2018/12/5. 6 | // Copyright © 2018 Jh. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /JhDownProgressView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /JhDownProgressView/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // JhDownProgressView 4 | // 5 | // Created by Jh on 2018/12/5. 6 | // Copyright © 2018 Jh. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /JhDownProgressView/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // JhDownProgressView 4 | // 5 | // Created by Jh on 2018/12/5. 6 | // Copyright © 2018 Jh. 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 | -------------------------------------------------------------------------------- /JhDownProgressView.xcodeproj/xcuserdata/jh.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | JhDownProgressView.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /JhDownProgressView.xcodeproj/xcuserdata/lantongmac.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | JhDownProgressView.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /JhDownProgressViewTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /JhDownProgressViewUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JhDownProgressView 2 | 3 | JhDownProgressView - 自定义下载进度条(6种样式) 4 | 5 | ![](https://gitee.com/iotjh/Picture/raw/master/progressView.gif)
6 | 7 | ## Examples 8 | 9 | * Demo1 10 | 11 | ```objc 12 | //点击下载时 13 | [self setNOClick]; 14 | JhDownProgressView *progressView = [JhDownProgressView showWithStyle:JhStyleRectangle]; 15 | [self.view addSubview:progressView]; 16 | 17 | //设置下载进度 18 | progressView.Jh_progress = progressValue; 19 | 20 | //下载完成 21 | [self setYESClick]; 22 | 23 | - (void)setNOClick { 24 | self.view.userInteractionEnabled = NO; 25 | self.navigationController.navigationBar.userInteractionEnabled = NO;//将nav事件禁止 26 | self.tabBarController.tabBar.userInteractionEnabled = NO;//将tabbar事件禁止 27 | } 28 | 29 | - (void)setYESClick { 30 | self.view.userInteractionEnabled = YES; 31 | self.navigationController.navigationBar.userInteractionEnabled = YES; 32 | self.tabBarController.tabBar.userInteractionEnabled = YES; 33 | } 34 | ``` 35 | -------------------------------------------------------------------------------- /JhDownProgressViewTests/JhDownProgressViewTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // JhDownProgressViewTests.m 3 | // JhDownProgressViewTests 4 | // 5 | // Created by Jh on 2018/12/5. 6 | // Copyright © 2018 Jh. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JhDownProgressViewTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation JhDownProgressViewTests 16 | 17 | - (void)setUp { 18 | // Put setup code here. This method is called before the invocation of each test method in the class. 19 | } 20 | 21 | - (void)tearDown { 22 | // Put teardown code here. This method is called after the invocation of each test method in the class. 23 | } 24 | 25 | - (void)testExample { 26 | // This is an example of a functional test case. 27 | // Use XCTAssert and related functions to verify your tests produce the correct results. 28 | } 29 | 30 | - (void)testPerformanceExample { 31 | // This is an example of a performance test case. 32 | [self measureBlock:^{ 33 | // Put the code you want to measure the time of here. 34 | }]; 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /JhDownProgressViewUITests/JhDownProgressViewUITests.m: -------------------------------------------------------------------------------- 1 | // 2 | // JhDownProgressViewUITests.m 3 | // JhDownProgressViewUITests 4 | // 5 | // Created by Jh on 2018/12/5. 6 | // Copyright © 2018 Jh. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JhDownProgressViewUITests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation JhDownProgressViewUITests 16 | 17 | - (void)setUp { 18 | // Put setup code here. This method is called before the invocation of each test method in the class. 19 | 20 | // In UI tests it is usually best to stop immediately when a failure occurs. 21 | self.continueAfterFailure = NO; 22 | 23 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 24 | [[[XCUIApplication alloc] init] launch]; 25 | 26 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 27 | } 28 | 29 | - (void)tearDown { 30 | // Put teardown code here. This method is called after the invocation of each test method in the class. 31 | } 32 | 33 | - (void)testExample { 34 | // Use recording to get started writing UI tests. 35 | // Use XCTAssert and related functions to verify your tests produce the correct results. 36 | } 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /JhDownProgressView/JhDownProgressView.h: -------------------------------------------------------------------------------- 1 | // 2 | // JhDownProgressView.h 3 | // PersonalWage 4 | // 5 | // Created by Jh on 2018/12/3. 6 | // Copyright © 2018 Jh. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | typedef NS_ENUM(NSInteger, JhDownProgressStyle) { 14 | /** 百分百和文字 默认 */ 15 | JhStylePercentAndText = 0, 16 | /** 百分百和圆环 */ 17 | JhStylePercentAndRing, 18 | /** 圆环 */ 19 | JhStyleRing, 20 | /** 扇形 */ 21 | JhStyleSector, 22 | /** 长条形 */ 23 | JhStyleRectangle, 24 | /** 球 */ 25 | JhStyleBall, 26 | }; 27 | 28 | 29 | @interface JhDownProgressView : UIView 30 | 31 | /** 下载进度,内部按1.0计算 */ 32 | @property (nonatomic, assign) CGFloat Jh_progress; 33 | 34 | /** 宽度 默认10 */ 35 | @property (nonatomic, assign) CGFloat Jh_progressWidth; 36 | 37 | /** 进度条View背景颜色 */ 38 | @property(nonatomic,strong) UIColor *Jh_progressViewBgColor; 39 | 40 | /** 进度条颜色 */ 41 | @property(nonatomic,strong) UIColor *Jh_progressBarColor; 42 | 43 | @property (nonatomic, assign) JhDownProgressStyle Jh_downProgressStyle; 44 | 45 | /** 创建指定样式的下载进度条 */ 46 | + (id)showWithStyle:(JhDownProgressStyle )viewStyle; 47 | 48 | @end 49 | 50 | NS_ASSUME_NONNULL_END 51 | 52 | 53 | /** 54 | 55 | JhDownProgressView *progressView = [JhDownProgressView showWithStyle:JhStylepercentAndText]; 56 | [self.view addSubview:progressView]; 57 | 58 | CGFloat progressValue = 1.0 *progress.completedUnitCount/progress.totalUnitCount; 59 | NSLog(@" precent %f ",precent); 60 | progressView.Jh_progress = progressValue; 61 | 62 | */ 63 | 64 | -------------------------------------------------------------------------------- /JhDownProgressView/Base.lproj/Main.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 | 25 | -------------------------------------------------------------------------------- /JhDownProgressView/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | JhDownProgressView 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /JhDownProgressView/Base.lproj/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 | 25 | 26 | -------------------------------------------------------------------------------- /JhDownProgressView/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 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /JhDownProgressView/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // JhDownProgressView 4 | // 5 | // Created by Jh on 2018/12/5. 6 | // Copyright © 2018 Jh. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | return YES; 21 | } 22 | 23 | 24 | - (void)applicationWillResignActive:(UIApplication *)application { 25 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 26 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 27 | } 28 | 29 | 30 | - (void)applicationDidEnterBackground:(UIApplication *)application { 31 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 32 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 33 | } 34 | 35 | 36 | - (void)applicationWillEnterForeground:(UIApplication *)application { 37 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 38 | } 39 | 40 | 41 | - (void)applicationDidBecomeActive:(UIApplication *)application { 42 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 43 | } 44 | 45 | 46 | - (void)applicationWillTerminate:(UIApplication *)application { 47 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 48 | } 49 | 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /JhDownProgressView/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // JhDownProgressView 4 | // 5 | // Created by Jh on 2018/12/5. 6 | // Copyright © 2018 Jh. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import "JhDownProgressView.h" 11 | 12 | @interface ViewController () 13 | 14 | @property (nonatomic, strong) NSTimer *timer; 15 | 16 | @property (nonatomic, strong) JhDownProgressView *progressView; 17 | @property (nonatomic, strong) JhDownProgressView *progressView2; 18 | @property (nonatomic, strong) JhDownProgressView *progressView3; 19 | @property (nonatomic, strong) JhDownProgressView *progressView4; 20 | @property (nonatomic, strong) JhDownProgressView *progressView5; 21 | @property (nonatomic, strong) JhDownProgressView *progressView6; 22 | 23 | 24 | 25 | @end 26 | 27 | @implementation ViewController 28 | 29 | - (void)viewDidLoad { 30 | [super viewDidLoad]; 31 | 32 | /********************************* 模拟下载 ********************************/ 33 | 34 | [self setNOClick]; //真实下载时如果不让交互使用 35 | 36 | //点击下载按钮 ,开始下载 37 | //创建控件 38 | [self creatControl]; 39 | //添加定时器 40 | [self addTimer]; 41 | /********************************* 模拟下载 ********************************/ 42 | 43 | } 44 | 45 | - (void)setNOClick { 46 | self.view.userInteractionEnabled = NO; 47 | self.navigationController.navigationBar.userInteractionEnabled=NO;//将nav事件禁止 48 | self.tabBarController.tabBar.userInteractionEnabled=NO;//将tabbar事件禁止 49 | } 50 | 51 | - (void)setYESClick { 52 | self.view.userInteractionEnabled = YES; 53 | self.navigationController.navigationBar.userInteractionEnabled=YES; 54 | self.tabBarController.tabBar.userInteractionEnabled=YES; 55 | } 56 | 57 | 58 | #pragma mark - 点击背景 59 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 60 | NSLog(@"模拟交互 点击背景 "); 61 | } 62 | 63 | - (void)creatControl { 64 | JhDownProgressView *proress = [JhDownProgressView showWithStyle:JhStylePercentAndText]; 65 | // JhDownProgressView *progressView = [JhDownProgressView showWithStyle:JhStyle_percentAndRing]; 66 | // JhDownProgressView *progressView = [JhDownProgressView showWithStyle:JhStyle_Ring]; 67 | // JhDownProgressView *progressView = [JhDownProgressView showWithStyle:JhStyle_Sector]; 68 | // JhDownProgressView *progressView = [JhDownProgressView showWithStyle:JhStyle_Rectangle]; 69 | // JhDownProgressView *progressView = [JhDownProgressView showWithStyle:JhStyle_ball]; 70 | [self.view addSubview:proress]; 71 | _progressView = proress; 72 | 73 | JhDownProgressView *proress2 = [[JhDownProgressView alloc]initWithFrame:CGRectMake(20, 100, 150, 120)]; 74 | proress2.Jh_downProgressStyle = JhStylePercentAndRing; 75 | [self.view addSubview:proress2]; 76 | _progressView2 = proress2; 77 | 78 | JhDownProgressView *proress3 = [[JhDownProgressView alloc]initWithFrame:CGRectMake(200, 100, 150, 120)]; 79 | proress3.Jh_downProgressStyle = JhStyleRing; 80 | [self.view addSubview:proress3]; 81 | _progressView3 = proress3; 82 | 83 | JhDownProgressView *proress4 = [[JhDownProgressView alloc]initWithFrame:CGRectMake(20, 600, 150, 120)]; 84 | proress4.Jh_downProgressStyle = JhStyleSector; 85 | [self.view addSubview:proress4]; 86 | _progressView4 = proress4; 87 | 88 | JhDownProgressView *proress5 = [[JhDownProgressView alloc]initWithFrame:CGRectMake(200, 300, 150, 15)]; 89 | proress5.Jh_downProgressStyle = JhStyleRectangle; 90 | [self.view addSubview:proress5]; 91 | _progressView5 = proress5; 92 | 93 | JhDownProgressView *proress6 = [[JhDownProgressView alloc]initWithFrame:CGRectMake(200, 600, 150, 120)]; 94 | proress6.Jh_downProgressStyle = JhStyleBall; 95 | [self.view addSubview:proress6]; 96 | _progressView6 = proress6; 97 | } 98 | 99 | - (void)addTimer { 100 | _timer = [NSTimer scheduledTimerWithTimeInterval:0.2f target:self selector:@selector(timerAction) userInfo:nil repeats:YES]; 101 | [[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes]; 102 | } 103 | 104 | - (void)timerAction { 105 | _progressView.Jh_progress += 0.01; 106 | _progressView2.Jh_progress += 0.01; 107 | _progressView3.Jh_progress += 0.01; 108 | _progressView4.Jh_progress += 0.01; 109 | _progressView5.Jh_progress += 0.01; 110 | _progressView6.Jh_progress += 0.01; 111 | if (_progressView.Jh_progress >= 1) { 112 | [self removeTimer]; 113 | NSLog(@"下载完成"); 114 | [self setYESClick]; 115 | } 116 | } 117 | 118 | - (void)removeTimer { 119 | [_timer invalidate]; 120 | _timer = nil; 121 | } 122 | 123 | @end 124 | -------------------------------------------------------------------------------- /JhDownProgressView/JhDownProgressView.m: -------------------------------------------------------------------------------- 1 | // 2 | // JhDownProgressView.m 3 | // PersonalWage 4 | // 5 | // Created by Jh on 2018/12/3. 6 | // Copyright © 2018 Jh. All rights reserved. 7 | // 8 | 9 | #import "JhDownProgressView.h" 10 | 11 | #define Kwidth [UIScreen mainScreen].bounds.size.width 12 | #define Kheight [UIScreen mainScreen].bounds.size.height 13 | #define JhColorAlpha(r, g, b, a) [UIColor colorWithRed:((r) / 255.0) green:((g) / 255.0) blue:((b) / 255.0) alpha:(a)] 14 | #define JhColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0] 15 | #define JhRandomColor JhColor(arc4random_uniform(255), arc4random_uniform(255), arc4random_uniform(255)) 16 | 17 | 18 | /** 文字顶部底部间距 */ 19 | #define KMargin 15 20 | 21 | #define KProgressBorderWidth 2.0f 22 | #define KProgressPadding 1.0f 23 | /** 长条形颜色 */ 24 | #define KProgressColor_rectangle [UIColor orangeColor] 25 | 26 | @interface JhDownProgressView() 27 | 28 | /** 百分百文字 */ 29 | @property (nonatomic, strong) UILabel *percentTextLabel; 30 | /** 提示文字 */ 31 | @property (nonatomic, strong) UILabel *textLabel; 32 | /** 长条样式view */ 33 | @property (nonatomic, strong) UIView *rectangleView; 34 | 35 | 36 | @end 37 | 38 | @implementation JhDownProgressView 39 | 40 | 41 | - (instancetype)initWithFrame:(CGRect)frame { 42 | if (self = [super initWithFrame:frame]) { 43 | [self initDataAndSubviews]; 44 | } 45 | return self; 46 | } 47 | 48 | - (void)initDataAndSubviews { 49 | self.layer.cornerRadius = 5; 50 | self.clipsToBounds = YES; 51 | 52 | self.Jh_progressBarColor = [UIColor whiteColor]; 53 | self.Jh_progressViewBgColor = JhColor(45, 45, 45); 54 | self.backgroundColor =_Jh_progressViewBgColor; 55 | 56 | self.Jh_progressWidth = 5; 57 | _Jh_downProgressStyle = JhStylePercentAndText; 58 | } 59 | 60 | #pragma mark - 弹出视图 61 | + (id)show { 62 | CGFloat width = 150; 63 | CGFloat height = 120; 64 | CGRect frame = CGRectMake((Kwidth-width)/2, (Kheight-height)/2, width, height); 65 | return [[self alloc]initWithFrame:frame]; 66 | } 67 | 68 | #pragma mark - 创建指定样式的下载进度条 69 | + (id)showWithStyle:(JhDownProgressStyle )viewStyle { 70 | CGFloat width = 150; 71 | CGFloat height = 120; 72 | if (viewStyle == JhStyleRectangle) { 73 | width = 150; 74 | height = 15; 75 | } 76 | CGRect frame = CGRectMake((Kwidth-width)/2,(Kheight-height)/2, width, height); 77 | JhDownProgressView *progress = [[self alloc]initWithFrame:frame]; 78 | progress.Jh_downProgressStyle = viewStyle; 79 | return progress; 80 | } 81 | 82 | - (void)dismiss { 83 | self.Jh_progress = 1.0; 84 | } 85 | 86 | - (void)drawRect:(CGRect)rect { 87 | switch (_Jh_downProgressStyle) { 88 | case JhStylePercentAndText: 89 | { 90 | [self JhStylepercentAndText:rect]; 91 | } 92 | break; 93 | case JhStylePercentAndRing: 94 | { 95 | [self JhStylepercentAndRing:rect]; 96 | } 97 | break; 98 | case JhStyleRing: 99 | { 100 | [self JhStyleRing:rect]; 101 | } 102 | break; 103 | case JhStyleSector: 104 | { 105 | [self JhStyleSector:rect]; 106 | } 107 | break; 108 | case JhStyleRectangle: 109 | { 110 | 111 | } 112 | break; 113 | case JhStyleBall: 114 | { 115 | [self JhStyleball:rect]; 116 | } 117 | break; 118 | default: 119 | break; 120 | } 121 | } 122 | 123 | #pragma mark - 百分百和文字 (默认) 124 | - (void)JhStylepercentAndText:(CGRect)rect { 125 | // x,y为圆点坐标,radius半径,startAngle为开始的弧度,endAngle为 结束的弧度,clockwise 0为顺时针,1为逆时针。 126 | // CGContextAddArc(<#CGContextRef _Nullable c#>, <#CGFloat x#>, <#CGFloat y#>, <#CGFloat radius#>, <#CGFloat startAngle#>, <#CGFloat endAngle#>, <#int clockwise#>) 127 | 128 | CGContextRef ctx = UIGraphicsGetCurrentContext(); 129 | 130 | CGFloat xCenter = rect.size.width * 0.5; 131 | CGFloat yCenter = rect.size.height * 0.25 + KMargin; 132 | 133 | [_Jh_progressBarColor set]; 134 | 135 | //设置圆环的宽度 136 | CGContextSetLineWidth(ctx, _Jh_progressWidth); 137 | CGContextSetLineCap(ctx, kCGLineCapRound); 138 | CGFloat to = - M_PI * 0.5 + self.Jh_progress * M_PI * 2 + 0.05; // 初始值0.05 139 | //半径 140 | CGFloat radius = MIN(rect.size.width, rect.size.height) * 0.3 - KMargin; 141 | CGContextAddArc(ctx, xCenter, yCenter, radius, - M_PI * 0.5, to, 0); 142 | CGContextStrokePath(ctx); 143 | 144 | CGFloat FrameWidth = self.bounds.size.width; 145 | self.percentTextLabel.frame = CGRectMake(0, yCenter-10, FrameWidth, 20); 146 | } 147 | 148 | #pragma mark - 百分百和圆环 149 | - (void)JhStylepercentAndRing:(CGRect)rect { 150 | CGContextRef ctx = UIGraphicsGetCurrentContext(); 151 | CGFloat xCenter = rect.size.width * 0.5; 152 | CGFloat yCenter = rect.size.height * 0.5; 153 | 154 | [_Jh_progressBarColor set]; 155 | 156 | //设置圆环的宽度 157 | CGContextSetLineWidth(ctx, _Jh_progressWidth); 158 | CGContextSetLineCap(ctx, kCGLineCapRound); 159 | CGFloat to = - M_PI * 0.5 + self.Jh_progress * M_PI * 2 + 0.05; // 初始值0.05 160 | //半径 161 | CGFloat radius = MIN(rect.size.width, rect.size.height) * 0.4 - KMargin; 162 | CGContextAddArc(ctx, xCenter, yCenter, radius, - M_PI * 0.5, to, 0); 163 | CGContextStrokePath(ctx); 164 | 165 | CGFloat FrameWidth = self.bounds.size.width; 166 | self.percentTextLabel.frame = CGRectMake(0, yCenter-10, FrameWidth, 20); 167 | } 168 | 169 | #pragma mark - 圆环 170 | - (void)JhStyleRing:(CGRect)rect { 171 | CGContextRef ctx = UIGraphicsGetCurrentContext(); 172 | CGFloat xCenter = rect.size.width * 0.5; 173 | CGFloat yCenter = rect.size.height * 0.5; 174 | 175 | [_Jh_progressBarColor set]; 176 | 177 | //设置圆环的宽度 178 | CGContextSetLineWidth(ctx, _Jh_progressWidth); 179 | CGContextSetLineCap(ctx, kCGLineCapRound); 180 | CGFloat to = - M_PI * 0.5 + self.Jh_progress * M_PI * 2 + 0.05; // 初始值0.05 181 | //半径 182 | CGFloat radius = MIN(rect.size.width, rect.size.height) * 0.4 - KMargin; 183 | CGContextAddArc(ctx, xCenter, yCenter, radius, - M_PI * 0.5, to, 0); 184 | CGContextStrokePath(ctx); 185 | } 186 | 187 | #pragma mark - 扇形 188 | - (void)JhStyleSector:(CGRect)rect { 189 | CGContextRef context = UIGraphicsGetCurrentContext(); 190 | CGFloat xCenter = rect.size.width * 0.5; 191 | CGFloat yCenter = rect.size.height * 0.5; 192 | CGFloat radius = MIN(rect.size.width, rect.size.height) * 0.5 - KMargin; 193 | //背景遮罩 194 | [_Jh_progressViewBgColor set]; 195 | 196 | CGFloat lineW = MAX(rect.size.width, rect.size.height) * 0.5; 197 | CGContextSetLineWidth(context, lineW); 198 | CGContextAddArc(context, xCenter, yCenter, radius + lineW * 0.5 + 5, 0, M_PI * 2, 1); 199 | CGContextStrokePath(context); 200 | 201 | //进程圆(圆环) 202 | // [_progressViewBgColor set]; 203 | CGContextSetLineWidth(context, 1); 204 | CGContextMoveToPoint(context, xCenter, yCenter); 205 | CGContextAddLineToPoint(context, xCenter, 0); 206 | CGFloat endAngle = - M_PI * 0.5 + self.Jh_progress * M_PI * 2 + 0.001; 207 | CGContextAddArc(context, xCenter, yCenter, radius, - M_PI * 0.5, endAngle, 1); 208 | CGContextFillPath(context); 209 | } 210 | 211 | #pragma mark - 球形 212 | - (void)JhStyleball:(CGRect)rect { 213 | CGContextRef ctx = UIGraphicsGetCurrentContext(); 214 | CGFloat xCenter = rect.size.width * 0.5; 215 | CGFloat yCenter = rect.size.height * 0.5; 216 | 217 | [_Jh_progressBarColor set]; 218 | 219 | CGFloat radius = MIN(rect.size.width * 0.5, rect.size.height * 0.5) - KMargin; 220 | 221 | //画椭圆 222 | CGFloat w = radius * 2; 223 | // CGFloat w = radius * 2 + 10; 224 | CGFloat h = w; 225 | CGFloat x = (rect.size.width - w) * 0.5; 226 | CGFloat y = (rect.size.height - h) * 0.5; 227 | CGContextAddEllipseInRect(ctx, CGRectMake(x, y, w, h)); 228 | CGContextFillPath(ctx); 229 | 230 | [[UIColor grayColor] set]; 231 | CGFloat startAngle = M_PI * 0.5 - self.Jh_progress * M_PI; 232 | CGFloat endAngle = M_PI * 0.5 + self.Jh_progress * M_PI; 233 | CGContextAddArc(ctx, xCenter, yCenter, radius, startAngle, endAngle, 0); 234 | CGContextFillPath(ctx); 235 | 236 | CGFloat FrameWidth = self.bounds.size.width; 237 | self.percentTextLabel.frame = CGRectMake(0, yCenter-10, FrameWidth, 20); 238 | } 239 | 240 | #pragma mark - getters and setters 241 | - (UILabel *)percentTextLabel { 242 | if (!_percentTextLabel) { 243 | UILabel *textLable = [[UILabel alloc]init]; 244 | textLable.text = @"0%"; 245 | textLable.textColor = _Jh_progressBarColor; 246 | textLable.font = [UIFont systemFontOfSize:13]; 247 | textLable.textAlignment = NSTextAlignmentCenter; 248 | textLable.frame = self.bounds; 249 | _percentTextLabel = textLable; 250 | [self addSubview:self.percentTextLabel]; 251 | } 252 | return _percentTextLabel; 253 | } 254 | 255 | - (UILabel *)textLabel { 256 | if (!_textLabel) { 257 | UILabel *textLable = [[UILabel alloc]init]; 258 | textLable.text = @"正在下载..."; 259 | textLable.textColor = _Jh_progressBarColor; 260 | textLable.font = [UIFont systemFontOfSize:15]; 261 | textLable.textAlignment = NSTextAlignmentCenter; 262 | CGFloat textHeight = 25; 263 | CGFloat FrameWidth = self.bounds.size.width; 264 | CGFloat FrameHeight = self.bounds.size.height; 265 | textLable.frame = CGRectMake(0,FrameHeight-textHeight-KMargin, FrameWidth, textHeight); 266 | _textLabel = textLable; 267 | [self addSubview:self.textLabel]; 268 | } 269 | return _textLabel; 270 | } 271 | 272 | - (void)setJh_progress:(CGFloat)Jh_progress { 273 | _Jh_progress = Jh_progress; 274 | if (_Jh_downProgressStyle == JhStylePercentAndText || _Jh_downProgressStyle == JhStylePercentAndRing) { 275 | self.percentTextLabel.text = [NSString stringWithFormat:@"%d%%", (int)floor(Jh_progress * 100)]; 276 | } else if (_Jh_downProgressStyle == JhStyleRing) { 277 | 278 | } else if (_Jh_downProgressStyle == JhStyleSector) { 279 | 280 | } else if (_Jh_downProgressStyle == JhStyleRectangle ){ 281 | CGFloat margin = KProgressBorderWidth + KProgressPadding; 282 | CGFloat maxWidth = self.bounds.size.width - margin * 2; 283 | CGFloat heigth = self.bounds.size.height - margin * 2; 284 | self.rectangleView.frame = CGRectMake(margin, margin, maxWidth * Jh_progress, heigth); 285 | } else if (_Jh_downProgressStyle == JhStyleBall) { 286 | self.percentTextLabel.text = [NSString stringWithFormat:@"%d%%", (int)floor(Jh_progress * 100)]; 287 | } 288 | if (_Jh_progress >= 1.0) { 289 | [self removeFromSuperview]; 290 | } else { 291 | [self setNeedsDisplay]; 292 | } 293 | } 294 | 295 | - (void)setJh_progressWidth:(CGFloat)Jh_progressWidth { 296 | _Jh_progressWidth = Jh_progressWidth; 297 | [self setNeedsDisplay]; 298 | } 299 | 300 | - (void)setJh_progressViewBgColor:(UIColor *)Jh_progressViewBgColor { 301 | _Jh_progressViewBgColor = Jh_progressViewBgColor; 302 | } 303 | 304 | - (void)setJh_progressBarColor:(UIColor *)Jh_progressBarColor { 305 | _Jh_progressBarColor = Jh_progressBarColor; 306 | } 307 | 308 | -(void)setJh_downProgressStyle:(JhDownProgressStyle)Jh_downProgressStyle { 309 | _Jh_downProgressStyle = Jh_downProgressStyle; 310 | switch (_Jh_downProgressStyle) { 311 | /** 百分百和文字 默认 */ 312 | case JhStylePercentAndText: 313 | { 314 | [self percentTextLabel]; 315 | [self textLabel]; 316 | } 317 | break; 318 | /** 百分百和圆环 */ 319 | case JhStylePercentAndRing: 320 | { 321 | [self percentTextLabel]; 322 | } 323 | break; 324 | /** 圆环 */ 325 | case JhStyleRing: 326 | { 327 | 328 | } 329 | break; 330 | /** 扇形 */ 331 | case JhStyleSector: 332 | { 333 | self.backgroundColor = JhColorAlpha(240, 240, 240, 0.9); 334 | } 335 | break; 336 | /** 长方形 */ 337 | case JhStyleRectangle: 338 | { 339 | self.backgroundColor = JhColorAlpha(240, 240, 240, 0.9); 340 | /********************************* 长条形样式 ********************************/ 341 | //底部边框 342 | UIView *borderView = [[UIView alloc] initWithFrame:self.bounds]; 343 | borderView.layer.cornerRadius = self.bounds.size.height * 0.5; 344 | borderView.layer.masksToBounds = YES; 345 | borderView.backgroundColor = _Jh_progressViewBgColor; 346 | borderView.layer.borderColor = [JhColorAlpha(240, 240, 240, 0.9) CGColor]; 347 | borderView.layer.borderWidth = KProgressBorderWidth; 348 | [self addSubview:borderView]; 349 | //进度 350 | UIView *rectangleView = [[UIView alloc] init]; 351 | rectangleView.backgroundColor = _Jh_progressBarColor; 352 | rectangleView.layer.cornerRadius = (self.bounds.size.height - (KProgressBorderWidth + KProgressPadding) * 2) * 0.5; 353 | rectangleView.layer.masksToBounds = YES; 354 | [self addSubview:rectangleView]; 355 | self.rectangleView = rectangleView; 356 | /********************************* 长条形样式 ********************************/ 357 | } 358 | break; 359 | /** 球 */ 360 | case JhStyleBall: 361 | { 362 | [self percentTextLabel]; 363 | } 364 | break; 365 | default: 366 | break; 367 | } 368 | [self setNeedsDisplay]; 369 | } 370 | 371 | 372 | 373 | @end 374 | -------------------------------------------------------------------------------- /JhDownProgressView.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | E92A1A4121B7612B001B6FD5 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E92A1A4021B7612B001B6FD5 /* AppDelegate.m */; }; 11 | E92A1A4421B7612B001B6FD5 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E92A1A4321B7612B001B6FD5 /* ViewController.m */; }; 12 | E92A1A4721B7612B001B6FD5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E92A1A4521B7612B001B6FD5 /* Main.storyboard */; }; 13 | E92A1A4921B7612D001B6FD5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E92A1A4821B7612D001B6FD5 /* Assets.xcassets */; }; 14 | E92A1A4C21B7612D001B6FD5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E92A1A4A21B7612D001B6FD5 /* LaunchScreen.storyboard */; }; 15 | E92A1A4F21B7612D001B6FD5 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E92A1A4E21B7612D001B6FD5 /* main.m */; }; 16 | E92A1A5921B7612D001B6FD5 /* JhDownProgressViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E92A1A5821B7612D001B6FD5 /* JhDownProgressViewTests.m */; }; 17 | E92A1A6421B7612D001B6FD5 /* JhDownProgressViewUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = E92A1A6321B7612D001B6FD5 /* JhDownProgressViewUITests.m */; }; 18 | E92A1A7321B76150001B6FD5 /* JhDownProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = E92A1A7221B76150001B6FD5 /* JhDownProgressView.m */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | E92A1A5521B7612D001B6FD5 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = E92A1A3421B7612B001B6FD5 /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = E92A1A3B21B7612B001B6FD5; 27 | remoteInfo = JhDownProgressView; 28 | }; 29 | E92A1A6021B7612D001B6FD5 /* PBXContainerItemProxy */ = { 30 | isa = PBXContainerItemProxy; 31 | containerPortal = E92A1A3421B7612B001B6FD5 /* Project object */; 32 | proxyType = 1; 33 | remoteGlobalIDString = E92A1A3B21B7612B001B6FD5; 34 | remoteInfo = JhDownProgressView; 35 | }; 36 | /* End PBXContainerItemProxy section */ 37 | 38 | /* Begin PBXFileReference section */ 39 | E92A1A3C21B7612B001B6FD5 /* JhDownProgressView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JhDownProgressView.app; sourceTree = BUILT_PRODUCTS_DIR; }; 40 | E92A1A3F21B7612B001B6FD5 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 41 | E92A1A4021B7612B001B6FD5 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 42 | E92A1A4221B7612B001B6FD5 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 43 | E92A1A4321B7612B001B6FD5 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 44 | E92A1A4621B7612B001B6FD5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 45 | E92A1A4821B7612D001B6FD5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 46 | E92A1A4B21B7612D001B6FD5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 47 | E92A1A4D21B7612D001B6FD5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 48 | E92A1A4E21B7612D001B6FD5 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 49 | E92A1A5421B7612D001B6FD5 /* JhDownProgressViewTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JhDownProgressViewTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 50 | E92A1A5821B7612D001B6FD5 /* JhDownProgressViewTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JhDownProgressViewTests.m; sourceTree = ""; }; 51 | E92A1A5A21B7612D001B6FD5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 52 | E92A1A5F21B7612D001B6FD5 /* JhDownProgressViewUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JhDownProgressViewUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | E92A1A6321B7612D001B6FD5 /* JhDownProgressViewUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JhDownProgressViewUITests.m; sourceTree = ""; }; 54 | E92A1A6521B7612D001B6FD5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 55 | E92A1A7121B76150001B6FD5 /* JhDownProgressView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JhDownProgressView.h; sourceTree = ""; }; 56 | E92A1A7221B76150001B6FD5 /* JhDownProgressView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JhDownProgressView.m; sourceTree = ""; }; 57 | /* End PBXFileReference section */ 58 | 59 | /* Begin PBXFrameworksBuildPhase section */ 60 | E92A1A3921B7612B001B6FD5 /* Frameworks */ = { 61 | isa = PBXFrameworksBuildPhase; 62 | buildActionMask = 2147483647; 63 | files = ( 64 | ); 65 | runOnlyForDeploymentPostprocessing = 0; 66 | }; 67 | E92A1A5121B7612D001B6FD5 /* Frameworks */ = { 68 | isa = PBXFrameworksBuildPhase; 69 | buildActionMask = 2147483647; 70 | files = ( 71 | ); 72 | runOnlyForDeploymentPostprocessing = 0; 73 | }; 74 | E92A1A5C21B7612D001B6FD5 /* Frameworks */ = { 75 | isa = PBXFrameworksBuildPhase; 76 | buildActionMask = 2147483647; 77 | files = ( 78 | ); 79 | runOnlyForDeploymentPostprocessing = 0; 80 | }; 81 | /* End PBXFrameworksBuildPhase section */ 82 | 83 | /* Begin PBXGroup section */ 84 | E92A1A3321B7612B001B6FD5 = { 85 | isa = PBXGroup; 86 | children = ( 87 | E92A1A3E21B7612B001B6FD5 /* JhDownProgressView */, 88 | E92A1A5721B7612D001B6FD5 /* JhDownProgressViewTests */, 89 | E92A1A6221B7612D001B6FD5 /* JhDownProgressViewUITests */, 90 | E92A1A3D21B7612B001B6FD5 /* Products */, 91 | ); 92 | sourceTree = ""; 93 | }; 94 | E92A1A3D21B7612B001B6FD5 /* Products */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | E92A1A3C21B7612B001B6FD5 /* JhDownProgressView.app */, 98 | E92A1A5421B7612D001B6FD5 /* JhDownProgressViewTests.xctest */, 99 | E92A1A5F21B7612D001B6FD5 /* JhDownProgressViewUITests.xctest */, 100 | ); 101 | name = Products; 102 | sourceTree = ""; 103 | }; 104 | E92A1A3E21B7612B001B6FD5 /* JhDownProgressView */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | E92A1A7121B76150001B6FD5 /* JhDownProgressView.h */, 108 | E92A1A7221B76150001B6FD5 /* JhDownProgressView.m */, 109 | E92A1A3F21B7612B001B6FD5 /* AppDelegate.h */, 110 | E92A1A4021B7612B001B6FD5 /* AppDelegate.m */, 111 | E92A1A4221B7612B001B6FD5 /* ViewController.h */, 112 | E92A1A4321B7612B001B6FD5 /* ViewController.m */, 113 | E92A1A4521B7612B001B6FD5 /* Main.storyboard */, 114 | E92A1A4821B7612D001B6FD5 /* Assets.xcassets */, 115 | E92A1A4A21B7612D001B6FD5 /* LaunchScreen.storyboard */, 116 | E92A1A4D21B7612D001B6FD5 /* Info.plist */, 117 | E92A1A4E21B7612D001B6FD5 /* main.m */, 118 | ); 119 | path = JhDownProgressView; 120 | sourceTree = ""; 121 | }; 122 | E92A1A5721B7612D001B6FD5 /* JhDownProgressViewTests */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | E92A1A5821B7612D001B6FD5 /* JhDownProgressViewTests.m */, 126 | E92A1A5A21B7612D001B6FD5 /* Info.plist */, 127 | ); 128 | path = JhDownProgressViewTests; 129 | sourceTree = ""; 130 | }; 131 | E92A1A6221B7612D001B6FD5 /* JhDownProgressViewUITests */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | E92A1A6321B7612D001B6FD5 /* JhDownProgressViewUITests.m */, 135 | E92A1A6521B7612D001B6FD5 /* Info.plist */, 136 | ); 137 | path = JhDownProgressViewUITests; 138 | sourceTree = ""; 139 | }; 140 | /* End PBXGroup section */ 141 | 142 | /* Begin PBXNativeTarget section */ 143 | E92A1A3B21B7612B001B6FD5 /* JhDownProgressView */ = { 144 | isa = PBXNativeTarget; 145 | buildConfigurationList = E92A1A6821B7612D001B6FD5 /* Build configuration list for PBXNativeTarget "JhDownProgressView" */; 146 | buildPhases = ( 147 | E92A1A3821B7612B001B6FD5 /* Sources */, 148 | E92A1A3921B7612B001B6FD5 /* Frameworks */, 149 | E92A1A3A21B7612B001B6FD5 /* Resources */, 150 | ); 151 | buildRules = ( 152 | ); 153 | dependencies = ( 154 | ); 155 | name = JhDownProgressView; 156 | productName = JhDownProgressView; 157 | productReference = E92A1A3C21B7612B001B6FD5 /* JhDownProgressView.app */; 158 | productType = "com.apple.product-type.application"; 159 | }; 160 | E92A1A5321B7612D001B6FD5 /* JhDownProgressViewTests */ = { 161 | isa = PBXNativeTarget; 162 | buildConfigurationList = E92A1A6B21B7612D001B6FD5 /* Build configuration list for PBXNativeTarget "JhDownProgressViewTests" */; 163 | buildPhases = ( 164 | E92A1A5021B7612D001B6FD5 /* Sources */, 165 | E92A1A5121B7612D001B6FD5 /* Frameworks */, 166 | E92A1A5221B7612D001B6FD5 /* Resources */, 167 | ); 168 | buildRules = ( 169 | ); 170 | dependencies = ( 171 | E92A1A5621B7612D001B6FD5 /* PBXTargetDependency */, 172 | ); 173 | name = JhDownProgressViewTests; 174 | productName = JhDownProgressViewTests; 175 | productReference = E92A1A5421B7612D001B6FD5 /* JhDownProgressViewTests.xctest */; 176 | productType = "com.apple.product-type.bundle.unit-test"; 177 | }; 178 | E92A1A5E21B7612D001B6FD5 /* JhDownProgressViewUITests */ = { 179 | isa = PBXNativeTarget; 180 | buildConfigurationList = E92A1A6E21B7612D001B6FD5 /* Build configuration list for PBXNativeTarget "JhDownProgressViewUITests" */; 181 | buildPhases = ( 182 | E92A1A5B21B7612D001B6FD5 /* Sources */, 183 | E92A1A5C21B7612D001B6FD5 /* Frameworks */, 184 | E92A1A5D21B7612D001B6FD5 /* Resources */, 185 | ); 186 | buildRules = ( 187 | ); 188 | dependencies = ( 189 | E92A1A6121B7612D001B6FD5 /* PBXTargetDependency */, 190 | ); 191 | name = JhDownProgressViewUITests; 192 | productName = JhDownProgressViewUITests; 193 | productReference = E92A1A5F21B7612D001B6FD5 /* JhDownProgressViewUITests.xctest */; 194 | productType = "com.apple.product-type.bundle.ui-testing"; 195 | }; 196 | /* End PBXNativeTarget section */ 197 | 198 | /* Begin PBXProject section */ 199 | E92A1A3421B7612B001B6FD5 /* Project object */ = { 200 | isa = PBXProject; 201 | attributes = { 202 | LastUpgradeCheck = 1010; 203 | ORGANIZATIONNAME = Jh; 204 | TargetAttributes = { 205 | E92A1A3B21B7612B001B6FD5 = { 206 | CreatedOnToolsVersion = 10.1; 207 | }; 208 | E92A1A5321B7612D001B6FD5 = { 209 | CreatedOnToolsVersion = 10.1; 210 | TestTargetID = E92A1A3B21B7612B001B6FD5; 211 | }; 212 | E92A1A5E21B7612D001B6FD5 = { 213 | CreatedOnToolsVersion = 10.1; 214 | TestTargetID = E92A1A3B21B7612B001B6FD5; 215 | }; 216 | }; 217 | }; 218 | buildConfigurationList = E92A1A3721B7612B001B6FD5 /* Build configuration list for PBXProject "JhDownProgressView" */; 219 | compatibilityVersion = "Xcode 9.3"; 220 | developmentRegion = en; 221 | hasScannedForEncodings = 0; 222 | knownRegions = ( 223 | en, 224 | Base, 225 | ); 226 | mainGroup = E92A1A3321B7612B001B6FD5; 227 | productRefGroup = E92A1A3D21B7612B001B6FD5 /* Products */; 228 | projectDirPath = ""; 229 | projectRoot = ""; 230 | targets = ( 231 | E92A1A3B21B7612B001B6FD5 /* JhDownProgressView */, 232 | E92A1A5321B7612D001B6FD5 /* JhDownProgressViewTests */, 233 | E92A1A5E21B7612D001B6FD5 /* JhDownProgressViewUITests */, 234 | ); 235 | }; 236 | /* End PBXProject section */ 237 | 238 | /* Begin PBXResourcesBuildPhase section */ 239 | E92A1A3A21B7612B001B6FD5 /* Resources */ = { 240 | isa = PBXResourcesBuildPhase; 241 | buildActionMask = 2147483647; 242 | files = ( 243 | E92A1A4C21B7612D001B6FD5 /* LaunchScreen.storyboard in Resources */, 244 | E92A1A4921B7612D001B6FD5 /* Assets.xcassets in Resources */, 245 | E92A1A4721B7612B001B6FD5 /* Main.storyboard in Resources */, 246 | ); 247 | runOnlyForDeploymentPostprocessing = 0; 248 | }; 249 | E92A1A5221B7612D001B6FD5 /* Resources */ = { 250 | isa = PBXResourcesBuildPhase; 251 | buildActionMask = 2147483647; 252 | files = ( 253 | ); 254 | runOnlyForDeploymentPostprocessing = 0; 255 | }; 256 | E92A1A5D21B7612D001B6FD5 /* Resources */ = { 257 | isa = PBXResourcesBuildPhase; 258 | buildActionMask = 2147483647; 259 | files = ( 260 | ); 261 | runOnlyForDeploymentPostprocessing = 0; 262 | }; 263 | /* End PBXResourcesBuildPhase section */ 264 | 265 | /* Begin PBXSourcesBuildPhase section */ 266 | E92A1A3821B7612B001B6FD5 /* Sources */ = { 267 | isa = PBXSourcesBuildPhase; 268 | buildActionMask = 2147483647; 269 | files = ( 270 | E92A1A4421B7612B001B6FD5 /* ViewController.m in Sources */, 271 | E92A1A7321B76150001B6FD5 /* JhDownProgressView.m in Sources */, 272 | E92A1A4F21B7612D001B6FD5 /* main.m in Sources */, 273 | E92A1A4121B7612B001B6FD5 /* AppDelegate.m in Sources */, 274 | ); 275 | runOnlyForDeploymentPostprocessing = 0; 276 | }; 277 | E92A1A5021B7612D001B6FD5 /* Sources */ = { 278 | isa = PBXSourcesBuildPhase; 279 | buildActionMask = 2147483647; 280 | files = ( 281 | E92A1A5921B7612D001B6FD5 /* JhDownProgressViewTests.m in Sources */, 282 | ); 283 | runOnlyForDeploymentPostprocessing = 0; 284 | }; 285 | E92A1A5B21B7612D001B6FD5 /* Sources */ = { 286 | isa = PBXSourcesBuildPhase; 287 | buildActionMask = 2147483647; 288 | files = ( 289 | E92A1A6421B7612D001B6FD5 /* JhDownProgressViewUITests.m in Sources */, 290 | ); 291 | runOnlyForDeploymentPostprocessing = 0; 292 | }; 293 | /* End PBXSourcesBuildPhase section */ 294 | 295 | /* Begin PBXTargetDependency section */ 296 | E92A1A5621B7612D001B6FD5 /* PBXTargetDependency */ = { 297 | isa = PBXTargetDependency; 298 | target = E92A1A3B21B7612B001B6FD5 /* JhDownProgressView */; 299 | targetProxy = E92A1A5521B7612D001B6FD5 /* PBXContainerItemProxy */; 300 | }; 301 | E92A1A6121B7612D001B6FD5 /* PBXTargetDependency */ = { 302 | isa = PBXTargetDependency; 303 | target = E92A1A3B21B7612B001B6FD5 /* JhDownProgressView */; 304 | targetProxy = E92A1A6021B7612D001B6FD5 /* PBXContainerItemProxy */; 305 | }; 306 | /* End PBXTargetDependency section */ 307 | 308 | /* Begin PBXVariantGroup section */ 309 | E92A1A4521B7612B001B6FD5 /* Main.storyboard */ = { 310 | isa = PBXVariantGroup; 311 | children = ( 312 | E92A1A4621B7612B001B6FD5 /* Base */, 313 | ); 314 | name = Main.storyboard; 315 | sourceTree = ""; 316 | }; 317 | E92A1A4A21B7612D001B6FD5 /* LaunchScreen.storyboard */ = { 318 | isa = PBXVariantGroup; 319 | children = ( 320 | E92A1A4B21B7612D001B6FD5 /* Base */, 321 | ); 322 | name = LaunchScreen.storyboard; 323 | sourceTree = ""; 324 | }; 325 | /* End PBXVariantGroup section */ 326 | 327 | /* Begin XCBuildConfiguration section */ 328 | E92A1A6621B7612D001B6FD5 /* Debug */ = { 329 | isa = XCBuildConfiguration; 330 | buildSettings = { 331 | ALWAYS_SEARCH_USER_PATHS = NO; 332 | CLANG_ANALYZER_NONNULL = YES; 333 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 334 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 335 | CLANG_CXX_LIBRARY = "libc++"; 336 | CLANG_ENABLE_MODULES = YES; 337 | CLANG_ENABLE_OBJC_ARC = YES; 338 | CLANG_ENABLE_OBJC_WEAK = YES; 339 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 340 | CLANG_WARN_BOOL_CONVERSION = YES; 341 | CLANG_WARN_COMMA = YES; 342 | CLANG_WARN_CONSTANT_CONVERSION = YES; 343 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 344 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 345 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 346 | CLANG_WARN_EMPTY_BODY = YES; 347 | CLANG_WARN_ENUM_CONVERSION = YES; 348 | CLANG_WARN_INFINITE_RECURSION = YES; 349 | CLANG_WARN_INT_CONVERSION = YES; 350 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 351 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 352 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 353 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 354 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 355 | CLANG_WARN_STRICT_PROTOTYPES = YES; 356 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 357 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 358 | CLANG_WARN_UNREACHABLE_CODE = YES; 359 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 360 | CODE_SIGN_IDENTITY = "iPhone Developer"; 361 | COPY_PHASE_STRIP = NO; 362 | DEBUG_INFORMATION_FORMAT = dwarf; 363 | ENABLE_STRICT_OBJC_MSGSEND = YES; 364 | ENABLE_TESTABILITY = YES; 365 | GCC_C_LANGUAGE_STANDARD = gnu11; 366 | GCC_DYNAMIC_NO_PIC = NO; 367 | GCC_NO_COMMON_BLOCKS = YES; 368 | GCC_OPTIMIZATION_LEVEL = 0; 369 | GCC_PREPROCESSOR_DEFINITIONS = ( 370 | "DEBUG=1", 371 | "$(inherited)", 372 | ); 373 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 374 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 375 | GCC_WARN_UNDECLARED_SELECTOR = YES; 376 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 377 | GCC_WARN_UNUSED_FUNCTION = YES; 378 | GCC_WARN_UNUSED_VARIABLE = YES; 379 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 380 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 381 | MTL_FAST_MATH = YES; 382 | ONLY_ACTIVE_ARCH = YES; 383 | SDKROOT = iphoneos; 384 | }; 385 | name = Debug; 386 | }; 387 | E92A1A6721B7612D001B6FD5 /* Release */ = { 388 | isa = XCBuildConfiguration; 389 | buildSettings = { 390 | ALWAYS_SEARCH_USER_PATHS = NO; 391 | CLANG_ANALYZER_NONNULL = YES; 392 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 393 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 394 | CLANG_CXX_LIBRARY = "libc++"; 395 | CLANG_ENABLE_MODULES = YES; 396 | CLANG_ENABLE_OBJC_ARC = YES; 397 | CLANG_ENABLE_OBJC_WEAK = YES; 398 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 399 | CLANG_WARN_BOOL_CONVERSION = YES; 400 | CLANG_WARN_COMMA = YES; 401 | CLANG_WARN_CONSTANT_CONVERSION = YES; 402 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 403 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 404 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 405 | CLANG_WARN_EMPTY_BODY = YES; 406 | CLANG_WARN_ENUM_CONVERSION = YES; 407 | CLANG_WARN_INFINITE_RECURSION = YES; 408 | CLANG_WARN_INT_CONVERSION = YES; 409 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 410 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 411 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 412 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 413 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 414 | CLANG_WARN_STRICT_PROTOTYPES = YES; 415 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 416 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 417 | CLANG_WARN_UNREACHABLE_CODE = YES; 418 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 419 | CODE_SIGN_IDENTITY = "iPhone Developer"; 420 | COPY_PHASE_STRIP = NO; 421 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 422 | ENABLE_NS_ASSERTIONS = NO; 423 | ENABLE_STRICT_OBJC_MSGSEND = YES; 424 | GCC_C_LANGUAGE_STANDARD = gnu11; 425 | GCC_NO_COMMON_BLOCKS = YES; 426 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 427 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 428 | GCC_WARN_UNDECLARED_SELECTOR = YES; 429 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 430 | GCC_WARN_UNUSED_FUNCTION = YES; 431 | GCC_WARN_UNUSED_VARIABLE = YES; 432 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 433 | MTL_ENABLE_DEBUG_INFO = NO; 434 | MTL_FAST_MATH = YES; 435 | SDKROOT = iphoneos; 436 | VALIDATE_PRODUCT = YES; 437 | }; 438 | name = Release; 439 | }; 440 | E92A1A6921B7612D001B6FD5 /* Debug */ = { 441 | isa = XCBuildConfiguration; 442 | buildSettings = { 443 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 444 | CODE_SIGN_STYLE = Automatic; 445 | DEVELOPMENT_TEAM = ""; 446 | INFOPLIST_FILE = JhDownProgressView/Info.plist; 447 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 448 | LD_RUNPATH_SEARCH_PATHS = ( 449 | "$(inherited)", 450 | "@executable_path/Frameworks", 451 | ); 452 | PRODUCT_BUNDLE_IDENTIFIER = com.Jh.JhDownProgressView; 453 | PRODUCT_NAME = "$(TARGET_NAME)"; 454 | TARGETED_DEVICE_FAMILY = "1,2"; 455 | }; 456 | name = Debug; 457 | }; 458 | E92A1A6A21B7612D001B6FD5 /* Release */ = { 459 | isa = XCBuildConfiguration; 460 | buildSettings = { 461 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 462 | CODE_SIGN_STYLE = Automatic; 463 | DEVELOPMENT_TEAM = ""; 464 | INFOPLIST_FILE = JhDownProgressView/Info.plist; 465 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 466 | LD_RUNPATH_SEARCH_PATHS = ( 467 | "$(inherited)", 468 | "@executable_path/Frameworks", 469 | ); 470 | PRODUCT_BUNDLE_IDENTIFIER = com.Jh.JhDownProgressView; 471 | PRODUCT_NAME = "$(TARGET_NAME)"; 472 | TARGETED_DEVICE_FAMILY = "1,2"; 473 | }; 474 | name = Release; 475 | }; 476 | E92A1A6C21B7612D001B6FD5 /* Debug */ = { 477 | isa = XCBuildConfiguration; 478 | buildSettings = { 479 | BUNDLE_LOADER = "$(TEST_HOST)"; 480 | CODE_SIGN_STYLE = Automatic; 481 | DEVELOPMENT_TEAM = 8ZH8KFMR9N; 482 | INFOPLIST_FILE = JhDownProgressViewTests/Info.plist; 483 | LD_RUNPATH_SEARCH_PATHS = ( 484 | "$(inherited)", 485 | "@executable_path/Frameworks", 486 | "@loader_path/Frameworks", 487 | ); 488 | PRODUCT_BUNDLE_IDENTIFIER = com.bjdsst.JhDownProgressViewTests; 489 | PRODUCT_NAME = "$(TARGET_NAME)"; 490 | TARGETED_DEVICE_FAMILY = "1,2"; 491 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/JhDownProgressView.app/JhDownProgressView"; 492 | }; 493 | name = Debug; 494 | }; 495 | E92A1A6D21B7612D001B6FD5 /* Release */ = { 496 | isa = XCBuildConfiguration; 497 | buildSettings = { 498 | BUNDLE_LOADER = "$(TEST_HOST)"; 499 | CODE_SIGN_STYLE = Automatic; 500 | DEVELOPMENT_TEAM = 8ZH8KFMR9N; 501 | INFOPLIST_FILE = JhDownProgressViewTests/Info.plist; 502 | LD_RUNPATH_SEARCH_PATHS = ( 503 | "$(inherited)", 504 | "@executable_path/Frameworks", 505 | "@loader_path/Frameworks", 506 | ); 507 | PRODUCT_BUNDLE_IDENTIFIER = com.bjdsst.JhDownProgressViewTests; 508 | PRODUCT_NAME = "$(TARGET_NAME)"; 509 | TARGETED_DEVICE_FAMILY = "1,2"; 510 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/JhDownProgressView.app/JhDownProgressView"; 511 | }; 512 | name = Release; 513 | }; 514 | E92A1A6F21B7612D001B6FD5 /* Debug */ = { 515 | isa = XCBuildConfiguration; 516 | buildSettings = { 517 | CODE_SIGN_STYLE = Automatic; 518 | DEVELOPMENT_TEAM = 8ZH8KFMR9N; 519 | INFOPLIST_FILE = JhDownProgressViewUITests/Info.plist; 520 | LD_RUNPATH_SEARCH_PATHS = ( 521 | "$(inherited)", 522 | "@executable_path/Frameworks", 523 | "@loader_path/Frameworks", 524 | ); 525 | PRODUCT_BUNDLE_IDENTIFIER = com.bjdsst.JhDownProgressViewUITests; 526 | PRODUCT_NAME = "$(TARGET_NAME)"; 527 | TARGETED_DEVICE_FAMILY = "1,2"; 528 | TEST_TARGET_NAME = JhDownProgressView; 529 | }; 530 | name = Debug; 531 | }; 532 | E92A1A7021B7612D001B6FD5 /* Release */ = { 533 | isa = XCBuildConfiguration; 534 | buildSettings = { 535 | CODE_SIGN_STYLE = Automatic; 536 | DEVELOPMENT_TEAM = 8ZH8KFMR9N; 537 | INFOPLIST_FILE = JhDownProgressViewUITests/Info.plist; 538 | LD_RUNPATH_SEARCH_PATHS = ( 539 | "$(inherited)", 540 | "@executable_path/Frameworks", 541 | "@loader_path/Frameworks", 542 | ); 543 | PRODUCT_BUNDLE_IDENTIFIER = com.bjdsst.JhDownProgressViewUITests; 544 | PRODUCT_NAME = "$(TARGET_NAME)"; 545 | TARGETED_DEVICE_FAMILY = "1,2"; 546 | TEST_TARGET_NAME = JhDownProgressView; 547 | }; 548 | name = Release; 549 | }; 550 | /* End XCBuildConfiguration section */ 551 | 552 | /* Begin XCConfigurationList section */ 553 | E92A1A3721B7612B001B6FD5 /* Build configuration list for PBXProject "JhDownProgressView" */ = { 554 | isa = XCConfigurationList; 555 | buildConfigurations = ( 556 | E92A1A6621B7612D001B6FD5 /* Debug */, 557 | E92A1A6721B7612D001B6FD5 /* Release */, 558 | ); 559 | defaultConfigurationIsVisible = 0; 560 | defaultConfigurationName = Release; 561 | }; 562 | E92A1A6821B7612D001B6FD5 /* Build configuration list for PBXNativeTarget "JhDownProgressView" */ = { 563 | isa = XCConfigurationList; 564 | buildConfigurations = ( 565 | E92A1A6921B7612D001B6FD5 /* Debug */, 566 | E92A1A6A21B7612D001B6FD5 /* Release */, 567 | ); 568 | defaultConfigurationIsVisible = 0; 569 | defaultConfigurationName = Release; 570 | }; 571 | E92A1A6B21B7612D001B6FD5 /* Build configuration list for PBXNativeTarget "JhDownProgressViewTests" */ = { 572 | isa = XCConfigurationList; 573 | buildConfigurations = ( 574 | E92A1A6C21B7612D001B6FD5 /* Debug */, 575 | E92A1A6D21B7612D001B6FD5 /* Release */, 576 | ); 577 | defaultConfigurationIsVisible = 0; 578 | defaultConfigurationName = Release; 579 | }; 580 | E92A1A6E21B7612D001B6FD5 /* Build configuration list for PBXNativeTarget "JhDownProgressViewUITests" */ = { 581 | isa = XCConfigurationList; 582 | buildConfigurations = ( 583 | E92A1A6F21B7612D001B6FD5 /* Debug */, 584 | E92A1A7021B7612D001B6FD5 /* Release */, 585 | ); 586 | defaultConfigurationIsVisible = 0; 587 | defaultConfigurationName = Release; 588 | }; 589 | /* End XCConfigurationList section */ 590 | }; 591 | rootObject = E92A1A3421B7612B001B6FD5 /* Project object */; 592 | } 593 | --------------------------------------------------------------------------------