




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目前在自己的个人项目里,已经开始使用Swift去编写代码。这篇文章把项目中自己设计的一个ActivityIndicator View展示给大家。在开始之前,我们先看看最终的效果,如下图:我建议大家下载本文对应在Github分享的完整项目,以便跟着本篇文章来阅读代码。需求分析我们需要实现一个自定义的和UIActivityIndicatorView提供相似功能的一个Loading效果。我们将使用Core Graphics来绘制这样的效果,并让它动起来。让我们先分析一下这个控件的组成,为我们实际编码提供具体的思路。首先,这个loading效果图,是由8个圆弧组成的一个圆。我们先要会画圆弧:像这样画8个圆弧,围成一个圆:然后通过重复改变每一个圆弧的颜色,让它动起来。我们继承UIView, 重写drawRect方法绘制界面,第一步得到当前绘图的上下文:letcontext=UIGraphicsGetCurrentContext()绘制圆弧这里我们使用UIBezierPath类去构建路径,然后通过绘制路径的方式绘制圆弧。/初始化一个UIBezierPath实例letarcPath=UIBezierPath()/构建Arc路径arcPath.addArcWithCenter(CGPointMake(CGFloat(self.frame.size.width/2),CGFloat(self.frame.size.height/2),radius:CGFloat(Config.CC_ARC_DRAW_RADIUS),startAngle:CGFloat(DegreesToRadians(startAngle),endAngle:CGFloat(DegreesToRadians(startAngle+Config.CC_ARC_DRAW_DEGREE),clockwise:true)/把路径添加到当前绘图的上下文CGContextAddPath(context,arcPath.CGPath)/设置线段宽度CGContextSetLineWidth(context,CGFloat(Config.CC_ARC_DRAW_WIDTH)/设置线段颜色CGContextSetStrokeColorWithColor(context,strokeColor)/绘制CGContextStrokePath(context)通过如上的方式,我们就可以成功画出一个圆弧。其中:funcaddArcWithCenter(center:CGPoint,radius:CGFloat,startAngle:CGFloat,endAngle:CGFloat,clockwise:Bool)这个方法构建路径的解释是center为圆点坐标,radius为半径,startAngle为开始的弧度,endAngle为结束的弧度,clockwise表示的是顺时针还是逆时针。绘制8个圆弧当我们可以成功在绘图上下文绘制出圆弧时,我们应该开始着手绘制效果图中的8个圆弧,并让它在正确的位置,并带上不同颜色。这里是效果图的一些参数设置,包括半径,宽度,颜色等信息:structConfigstaticletCC_ACTIVITY_INDICATOR_VIEW_WIDTH=40staticletCC_ARC_DRAW_PADDING=3.0staticletCC_ARC_DRAW_DEGREE=39.0staticletCC_ARC_DRAW_WIDTH=6.0staticletCC_ARC_DRAW_RADIUS=10.0staticletCC_ARC_DRAW_COLORS=UIColor(red:242/255.0,green:242/255.0,blue:242/255.0,alpha:1.0).CGColor,UIColor(red:230/255.0,green:230/255.0,blue:230/255.0,alpha:1.0).CGColor,UIColor(red:179/255.0,green:179/255.0,blue:179/255.0,alpha:1.0).CGColor,UIColor(red:128/255.0,green:128/255.0,blue:128/255.0,alpha:1.0).CGColor,UIColor(red:128/255.0,green:128/255.0,blue:128/255.0,alpha:1.0).CGColor,UIColor(red:128/255.0,green:128/255.0,blue:128/255.0,alpha:1.0).CGColor,UIColor(red:128/255.0,green:128/255.0,blue:128/255.0,alpha:1.0).CGColor,UIColor(red:128/255.0,green:128/255.0,blue:128/255.0,alpha:1.0).CGColor我们可以在drawRect方法,循坏绘制8个圆弧,此时完整的代码看上去像这样:overridefuncdrawRect(rect:CGRect)letcontext=UIGraphicsGetCurrentContext()varstartAngle=Config.CC_ARC_DRAW_PADDINGforindexin1.8letarcPath=UIBezierPath()arcPath.addArcWithCenter(CGPointMake(CGFloat(self.frame.size.width/2),CGFloat(self.frame.size.height/2),radius:CGFloat(Config.CC_ARC_DRAW_RADIUS),startAngle:CGFloat(DegreesToRadians(startAngle),endAngle:CGFloat(DegreesToRadians(startAngle+Config.CC_ARC_DRAW_DEGREE),clockwise:true)CGContextAddPath(context,arcPath.CGPath)startAngle+=Config.CC_ARC_DRAW_DEGREE+(Config.CC_ARC_DRAW_PADDING*2)CGContextSetLineWidth(context,CGFloat(Config.CC_ARC_DRAW_WIDTH)letcolorIndex=abs(index-self.animateIndex)letstrokeColor=Config.CC_ARC_DRAW_COLORScolorIndexCGContextSetStrokeColorWithColor(context,strokeColor)CGContextStrokePath(context)使用for循环绘制8次,产生8个圆弧,并且设置不同的颜色。这里的self.animateIndex用来跟踪整个动画的头一个颜色最浅圆弧的位置。通过它和当前index的绝对值,获得当前圆弧应该显示的颜色。动起来在设计一个ActivityIndicator View的时候,我们应该像UIKit提供的 UIActivityIndicatorView 一样,至少需要实现这三组API:funcstartAnimating()funcstopAnimating()funcisAnimating()-Bool这里我们使用一个timer去改变self.animateIndex的值,不断重画当前视图,来产生动画效果,代码看起来像这样:/使用该值驱动改变圆弧颜色,产生动画效果privatevaranimateIndex:Int=1/动画的TimerprivatevaranimatedTimer:NSTimer?/timer响应的事件,在这里setNeedsDisplay让UIKit重画当前视图,然后不断改变animateIndex值。objcprivatefuncanimate()if!self.hiddenself.setNeedsDisplay()self.animateIndex+ifself.animateIndex8self.animateIndex=1/开始动画funcstartAnimating()ifself.hiddenself.hidden=falseiflettimer=self.animatedTimertimer.fire()elseself.animatedTimer=NSTimer(timeInterval:0.1,target:self,selector:”animate”,userInfo:nil,repeats:true)NSRunLoop.currentRunLoop().addTimer(self.animatedTimer!,forMode:NSRunLoopCommonModes)这里使用init(timeIntervalti:NSTimeInterval,targetaTarget:AnyObject,selectoraSelector:Selector,userInfo:AnyObject?,repeatsyesOrNo:Bool)-NSTimer而不是使用classfuncscheduledTimerWithTimeInterval(ti:NSTimeInterval,targetaTarget:AnyObject,selectoraSelector:Selector,userInfo:AnyObject?,repeatsyesOrNo:Bool)-NSTimer构建timer的原因是:当我们在使用自己的ActivityIndicator View的时候,我们可能把它放到UIScrollView上面。这个时候使用scheduledTimerWithTimeInterval创建的timer是加入到当前Run Loop中的,而UIScrollView在接收到用户交互事件时,主线程Run Loop会设置为UITrackingRunLoopMode。这个时候会导致timer失效。更详细的解答,我在走进Run Loop的世界 (一):什么是Run Loop?一文中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年高升专考前冲刺练习题含完整答案详解【全优】
- 小区安全出入口的定期检查与保养
- 展览印刷制作手册
- 塑胶模具维护细则
- 社会工作实务案例分析与分享
- 商业地产项目选址规划方案
- 2024自考专业(计算机信息管理)考试黑钻押题附参考答案详解【基础题】
- PEP五年级英语听力测试卷
- 2024-2025学年环境影响评价工程师之环境影响评价相关法律法规过关检测试卷及答案详解【各地真题】
- 大学实习导师评审规定
- 数字经济与就业
- 2024年-2025年司法考试真题及复习资料解析
- 幼儿园护学岗职责
- 国开电大《组织行为学》形考任务1-4
- 施工安全生产风险分级管控和隐患排查治理双重预防机制建设实施方案
- 【MOOC】化学与社会-大连理工大学 中国大学慕课MOOC答案
- 精细化工技术-大学专业介绍
- 餐饮财务问题的研究报告
- 慢性疾病运动干预中心服务要求(征求意见稿)
- 林同炎与美洲银行大厦
- (正式版)SH∕T 3548-2024 石油化工涂料防腐蚀工程施工及验收规范
评论
0/150
提交评论