├── .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 | 
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 |
--------------------------------------------------------------------------------