HELLO 我是(@孙占兴) 欢迎来到我的窝: http://www.teilim.com 转载请标明原文地址 ^_^
通过滑块选择进度条索完成的时间,时间越短进度条完成的越快,通过按钮控制状态,对 Slider 和 ProgressView 的初步使用。
先看一下最终的效果图:
首先在 Main.storyboard 中添加 Slider、ProgressView 两个控件,三个 Label ,和一个 Button 控件。
接下来在程序中创建相关的变量,通过拖线与相关的控件进行关联。
@property (weak, nonatomic) IBOutlet UISlider *sliderView; // 滑块 @property (weak, nonatomic) IBOutlet UIProgressView *ProgressView; // 进度条 @property (weak, nonatomic) IBOutlet UILabel *timeLabel; // 获取时间 @property (weak, nonatomic) IBOutlet UILabel *percentLabel; // 进度条速率 @property (weak, nonatomic) IBOutlet UIButton *button; // 按钮 @property (assign, nonatomic) NSTimer *progressTime; // 定时器 @property (assign, nonatomic) int time; // 计算时间
声明的NSTime是时间定时器,这里需要靠它来控制程序,分别将上面定义的变量与控件相关联:sliderView 与 Slider 、ProgressView 与 ProgressView 、timeLabel 与 '调节滑块获取时间' 、percentLabel 与 '0%~100%' 、button 与 Button,一一对应。
我们现在要定义三个函数,两个控件函数,一个无返回值函数,并在其中进行获取数值和实现功能。
- (void)start; // 计算定时器所累计数值 - (IBAction)action:(id)sender; // 监控按钮状态 - (IBAction)slideChange:(id)sender; // 计算滑块所用完成时间
当程序启动时,会让我们自己通过滑块给一个当前进度条完成一个时间的限制,并且要在我们给定的时间内完成,具体操作在下面的方法中实现。
- (IBAction)slideChange:(id)sender { self.time = (int)((10 - 0) * self.sliderView.value); self.timeLabel.text = [NSString stringWithFormat:@"%d秒",self.time]; }
根据自己的需求给滑块一个取值的范围,此处的范围是(0 ~ 10),强制转化为 int 类型,赋值给_time。将 _time转化成字符串,赋值给关联好的 timeLabel的text,显示在屏幕上。
在 start 函数中,我们将处理进度条的叠加状态,从而让它'跑起来'。
- (void)start { self.ProgressView.progress += 1.0 / self.time; self.percentLabel.text = [NSString stringWithFormat:@"%%%d",(int)(self.ProgressView.progress * 100)]; if(self.ProgressView.progress >= 1) { [self.button setTitle:@"完成" forState:UIControlStateNormal]; [self.progressTime invalidate]; self.progressTime = nil; } }
控制器获取 ProgressView 控件中 progress属性,将获取的时间处理,并且在第二次调用时进行叠加。将处理好的 progress 进行处理赋值给关联的 percentLabel 控件中 text 属性,显示在屏幕上。
现在我们要更新按钮的状态,不能让它在'跑完'的时候还是'开始'、'暂停'、'继续'的状态,故要进行判断,如果此时的进度条数值大于或等于1时,需将按钮状态更新为‘完成’,并且关闭定时器,将定时器清空。
时间已经根据我们上面的需求获取好了,我们要开始让进度条走起来了,但是怎么让听我们的话呢?让它'走就走、停就停呢?' 在这里还要通过一个定时器来控制,从而达到我们的需求。
- (void)action:(id)sender { if(!self.progressTime) { [self.button setTitle:@"暂停" forState:UIControlStateNormal]; self.progressTime = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(start) userInfo:nil repeats:YES]; [self.progressTime fire]; } else { [self.button setTitle:@"继续" forState:UIControlStateNormal]; [self.progressTime invalidate]; self.progressTime = nil; } }
通过 progressTime 是否为 nil 来判断定时器是否已经处于开启状态,如果当前定时器没有打开,那么按钮状态更新为'暂停',并开启定时器。如果已经开始,那么关闭定时器,并把按钮状态更新为'继续'。