1、新建视图控制器ViewController.m(不带xib),作为根视图控制器,通过ViewController的-(void)loadView方法构建UI,ViewController.h如下:
#importViewController.m如下:@interface ViewController : UIViewController{ CGFloat progressValue; //进度条的值 } @property(strong,nonatomic)UIProgressView *progress; @property(strong,nonatomic)UILabel *showValue; @property(strong,nonatomic)UIButton *startThread; @end
#import "ViewController.h" @implementation ViewController @synthesize progress; @synthesize showValue; @synthesize startThread; -(void)loadView{ CGRect appFrame = [UIScreen mainScreen].applicationFrame; UIView *view = [[UIView alloc]initWithFrame:appFrame]; self.view = view; //设置背景颜色 UIColor *bgcolor = [UIColor grayColor]; [self.view setBackgroundColor:bgcolor]; [self initViews]; } //初始化视图组件 -(void)initViews{ //初始化progress CGRect frame = CGRectMake(50, 50, 200, 30); progress = [[UIProgressView alloc]initWithFrame:frame]; [self.view addSubview:progress]; //初始化showValue showValue = [[UILabel alloc]init]; frame = showValue.frame; frame.origin.x = CGRectGetMaxX(progress.frame)+10; frame.origin.y = CGRectGetMinY(progress.frame); frame.size.width = 35; frame.size.height = 15; showValue.frame = frame; showValue.backgroundColor = [UIColor redColor]; showValue.text = @"0.0"; [self.view addSubview:showValue]; //初始化startThread startThread = [[UIButton alloc]init]; frame = startThread.frame; frame.origin.x = 110; frame.origin.y = 80; frame.size.width = 100; frame.size.height = 50; startThread.frame = frame; UIImage *img = [UIImage imageNamed:@"btn.png"]; [startThread setBackgroundImage:img forState:UIControlStateNormal]; [startThread setTitleColor:[UIColor colorWithRed:1.0 green:0 blue:0 alpha:1.0] forState:UIControlStateNormal]; [startThread setTitle:@"开启子线程" forState:UIControlStateNormal]; //设置事件 [startThread addTarget:self action:@selector(startThreadButtonPressed) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:startThread]; } //开启子线程 -(void)startThreadButtonPressed{ progress.progress = 0.0; showValue.text = @"0.0"; startThread.hidden = YES; //该语句会让主线程堵塞2秒,这就是为什么要将耗时操作放在子线程的原因之一 //[NSThread sleepForTimeInterval:2]; //开启一个新线程 [NSThread detachNewThreadSelector:@selector(doJobInBackground) toTarget:self withObject:nil]; } //子线程,后台执行工作 -(void)doJobInBackground{ //睡眠,模拟子线程中耗时操作 [NSThread sleepForTimeInterval:2]; //通知主线程执行更新操作 [self performSelectorOnMainThread:@selector(invalidateProgress) withObject:nil waitUntilDone:NO]; } //更新进度 -(void)invalidateProgress{ progressValue = [progress progress]; showValue.text = [NSString stringWithFormat:@"%.2f",progressValue]; if(progressValue < 1.0){ progress.progress = progressValue+0.02; //启动定时器 [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(invalidateProgress) userInfo:nil repeats:NO]; }else{ progress.progress = 1.0; showValue.text = @"1.0"; startThread.hidden = NO; } } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. progress = nil; showValue = nil; startThread = nil; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } @end2、运行效果如下:
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2305
- 用户1336
- 访客11455432
每日一句
Talent without working hard is nothing.
没有努力,天份不代表什么。
没有努力,天份不代表什么。
MySQL 数据库优化
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de
免ROOT实现模拟点击任意位置
Mobaxterm终端神器
CreateProcessW要注意的细节问题
Autonomous NAT Traversal
【教程】win10 彻底卸载edge浏览器
eclipse工程基于Xposed的一个简单Hook
排名前5的开源在线机器学习
Mac OS最简单及(Karabiner)快捷键设置
发一款C++编写的麻将
VMware NAT端口映射外网访问虚拟机linux
独家发布最新可用My-AutoPost——wordpress 采集器
新会员