相关文章推荐
暴走的小熊猫  ·  C#:ImportingConstructo ...·  1 年前    · 
文质彬彬的豆芽  ·  阿里达摩院获KDD ...·  2 年前    · 
阳刚的小马驹  ·  Vue在自定义指令绑定的处理函数中传递参数_ ...·  2 年前    · 
谦虚好学的紫菜  ·  [C#]MemoryStream.Dispo ...·  3 年前    · 
跑龙套的手链  ·  如何在 SpringBoot 中使用 ...·  3 年前    · 
Code  ›  [iOS] 圆形进度条及计时功能开发者社区
ios progress 计时器
https://cloud.tencent.com/developer/article/1341484
玩足球的烤土司
3 年前
作者头像
wOw
0 篇文章

[iOS] 圆形进度条及计时功能

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > wOw的Android小站 > 正文

[iOS] 圆形进度条及计时功能

发布 于 2018-09-18 14:54:04
1.6K 0
举报

完整代码可以看: Github 。 其实没什么难度,下面记录几个要点

放个预览图


画圆

用的贝塞尔曲线UIBezierPath来画,这个类支持画很多种形状,可以单独去尝试。

UIBezierPath *progress = [UIBezierPath bezierPath];
[progress addArcWithCenter:CGPointMake(rect.size.width / 2, rect.size.height / 2)
                      radius:RADIUS
                  startAngle:startAngle
                    endAngle:endAngle
                   clockwise:YES];
progress.lineWidth = PROGRESS_WIDTH;
[[UIColor redColor] set];
[progress stroke];

参数分别为圆心点、半径、绘制起始角度、绘制结束角度、顺时针方向。如果画一个整圆,角度设为0,2pi即可。这里0度对应3点钟方向,我希望绘制从12点方向开始,设置起始角度为-0.5pi即可。结束角度就根据经过的时间和总的时间的比例进行角度计算。有了以上参数也可以算出在当前角度下的圆周上点的坐标,即可以画出那个圆点。


定时器

这里为了绘制看起来更连贯,我选择0.05秒刷新一次界面,而没有参考系统定时器的1秒刷新一次,这样看起来会更舒服。但在显示数字上会遇到1秒的误差,所以我在格式化字符串的时候对剩余时间做了向上去整 ceil() 的操作,具体差别可以通过改代码来尝试。

m_timer = [NSTimer scheduledTimerWithTimeInterval:TIMER_INTERVAL target:self selector:@selector(setProgress) userInfo:nil repeats:YES];

UIPickerView循环显示

我一直以为iOS的滚轮是支持内容循环显示的,然而并没有看到相关接口,所以有点迷茫。查过资料后发现原来是用了一个技巧, 即循环设置非常多的滚轮内容,然后默认选择居中的item, 比如设置10000个项,内容是:0,1,2, …, 97, 98, 99, 0, 1, 2, …, 97, 98, 99, …,然后默认显示第5000个条目,这样用户划起来就好像是循环的。因为总的内容很多,用户不会划很多次,所以用户一般不会遇到划到头的情况。于是,我在系统计时器里试了一下,的确是这样的,当我往一个方向划动非常多次后,滚轮还是会到头的。所以这是可行的方法。

//这里可以直接用MAX_ROWS / 2,但下面的计算适合各种情况:取中间位置,取整,再取余根据余数校正起始位置为要显示内容的第一项(即选中居中的 0 的位置)
- (void)init {
[m_pickerView selectRow:(((NSInteger)((MAX_ROWS / 2) / [m_arrayData count])) * [m_arrayData count]) + (selectedRow % [m_arrayData count]) inComponent:0 animated:NO];
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
 
推荐文章
暴走的小熊猫  ·  C#:ImportingConstructor特性-CSDN博客
1 年前
文质彬彬的豆芽  ·  阿里达摩院获KDD 2022最佳论文,国内企业首次获奖_数据_领域_应用科学
2 年前
阳刚的小马驹  ·  Vue在自定义指令绑定的处理函数中传递参数_vue.js_脚本之家
2 年前
谦虚好学的紫菜  ·  [C#]MemoryStream.Dispose之后,为什么仍可以ToArray()?-阿里云开发者社区
3 年前
跑龙套的手链  ·  如何在 SpringBoot 中使用 cookies - 简书
3 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号