ProgressBar是一个很小却在很多地方都会用到的东西。也许是网络连接,也许APP本身有很多东西需要加载的。默认的只有一个旋转的菊花,对于打造一款个性的APP这显然是不够的。这里就使用CAShapeLayer打造一个个性的ProgressBar。这里只是抛砖引玉,你可以在这个基础上开发更适合你的。

CAShapeLayer是iOS开发中一个很强的东西,你可以用他开发出各种形状,还可以在上面加动画。所以,CAShapeLayer简直就是创建ProgressBar的完美选择。

这个ProgressBar是什么样的

我们要创建的ProgressBar首先具备某种形状,然后这个形状一直在做动画。一直到APP的网络请求或者信息加载完成之后,隐藏。这个形状可以是一条水平的线,就像是Safari加载网页时候的那样,或者是一个圆圈。总之,你可以用CAShapeLayer创建你需要的形状,然后在上面加动画。

而且加动画这一步也非常的简单。只需要创建一个CABasicAnimation,并运行这个动画就可以。

比如:

        let animation = CABasicAnimation(keyPath: "strokeEnd")
animation.fromValue = CGFloat(0.0)
animation.toValue = CGFloat(1.0)
animation.duration = 1.0
animation.delegate = self
animation.removedOnCompletion = false
animation.additive = true
animation.fillMode = kCAFillModeForwards
// progressLayer.addAnimation(animation, forKey: "strokeEnd")

如果,你在ProgressBar体现加载的进度的话,你可以通过给CAShapeLayer的strokeEnd属性赋值来首先。因为layers有两个非常重要的属性:一个是strokeStart,一个是strokeEnd。这两个属性是用来定义画线从哪里开始到哪里结束。这两个属性的值的范围在0到1,所以为了正确显示进度。你需要计算好开始和结束的百分比。

开始写代码吧

如前所述,首先你需要一个CAShapeLayer来呈现ProgressBar的形状。

UIBezierPath(arcCenter: centerPoint, radius: CGRectGetWidth(bounds) /  - 30.0, startAngle: startAngle, endAngle: endAngle, clockwise: true)

bounds是:

let bounds = CGRectMake(, , UIScreen.mainScreen().bounds.width - , UIScreen.mainScreen().bounds.height - )

首先,用UIBezierPath画一个圆,这个圆心就在于bounds给定的一个范围的中心。半径就是这个框的宽度减去30.0。

来看看全部的代码:

        var progressLayer = CAShapeLayer()
progressLayer.frame = bounds
progressLayer.path = UIBezierPath(arcCenter: centerPoint, radius: CGRectGetWidth(bounds) / - 30.0, startAngle: startAngle, endAngle: endAngle, clockwise: true).CGPath
progressLayer.backgroundColor = UIColor.clearColor().CGColor
progressLayer.fillColor = UIColor.clearColor().CGColor
progressLayer.strokeColor = UIColor.lightGrayColor().CGColor
progressLayer.lineWidth = 4.0
progressLayer.strokeStart = 0.0
progressLayer.strokeEnd = 0.0

在给progressLayer设定路线的时候需要给定的时路线的CGPath。这里是一些底层的东西,暂时不涉及。但是需要记住。fillColor是指在layer的path包围的范围内填充什么样的颜色。其他的属性就比较好理解了。

这个时候把progressLayer添加到self.view.layer中,运行代码。你就会看到一个lightGrayColor的颜色的圈圈。

这个时候就需要我们添加动画了。

        let animation = CABasicAnimation(keyPath: "strokeEnd")
animation.fromValue = CGFloat(0.0)
animation.toValue = CGFloat(1.0)
animation.delegate = self
animation.duration = 1.0
animation.delegate = self
animation.removedOnCompletion = false
animation.additive = true
animation.fillMode = kCAFillModeForwards
progressLayer.addAnimation(animation, forKey: "strokeEnd")

再次运行,这个动画就出现了。

Swift:使用CAShapeLayer打造一个ProgresssBar的更多相关文章

  1. [.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office

    打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...

  2. [后端人员耍前端系列]AngularJs篇:使用AngularJs打造一个简易权限系统

    一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多 ...

  3. Linux强化论:15步打造一个安全的Linux服务器

    Linux强化论:15步打造一个安全的Linux服务器 Alpha_h4ck2016-11-30共28761人围观 ,发现 8 个不明物体专题系统安全 可能大多数人都觉得Linux是安全的吧?但我要告 ...

  4. 在sublimetext上打造一个兼容virtualenv的web&python开发环境

    利用Sublimetext3&virtualenv 打造一个Web&Python IDE 注: 环境:window|python3;以下使用的sublimetext插件均用packag ...

  5. AngularJs打造一个简易权限系统

    AngularJs打造一个简易权限系统 一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJ ...

  6. swift学习:第一个swift程序

    原文:swift学习:第一个swift程序 最近swift有点火,赶紧跟上学习.于是,个人第一个swift程序诞生了... 新建项目

  7. RethinkDB创始人教你如何打造一个伟大的互联网产品

    关于作者 我叫Slava Akhmechet,本人是 RethinkDB 的创始人之一,RethinkDB是开源,分布式数据库,旨在帮助开发人员与运营商在打造实时应用时处理无结构数据 如何打造一个伟大 ...

  8. [.NET] 一步步打造一个简单的 MVC 网站 - BooksStore(一)

    一步步打造一个简单的 MVC 网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 简介 主 ...

  9. [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(二)

    一步步打造一个简单的 MVC 电商网站 - BooksStore(二) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 前: ...

随机推荐

  1. aop学习

    拦截器和过滤器的区别:https://blog.csdn.net/heyeqingquan/article/details/71482169 1,aop是一个编程思想,不是具体的实现,一般有Filte ...

  2. centos下安装docker最新版教程

    1.通过yum安装需要root或者能sudo的权限 yum包更新到最新$ sudo yum update 添加Docker yum源$ sudo tee /etc/yum.repos.d/docker ...

  3. 如何利用 AVDictionary 配置参数(转)

    本文是我的 FFMPEG Tips 系列的第五篇文章,准备介绍下 ffmpeg 提供的一个非常好用的健值对工具:AVDictionary,特别是对于没有 map 容器的 c 代码,可以充分利用它来配置 ...

  4. 显示Deprecated: Assigning the return value of new by reference is deprecated in解决办法

    很多朋友的php程序当php的版本升级到5.3以后,会出现”Deprecated: Assigning the return value of new by reference is deprecat ...

  5. Eclipse转Android Studio工程实践

    Eclipse转Android Studio工程有两种方式, 一种是兼容Eclipse,两者都可以使用,一种是全新的Android Gradle Project. 这里使用的Android Studi ...

  6. oracle 归档日志总结

    Oracle 归档模式和非归档模式 归档模式和非归档模式 在DBA部署数据库之初,必须要做出的最重要决定之一就是选择归档模式(ARCHIVELOG)或者非 归档模式(NOARCHIVELOG )下运行 ...

  7. WebKit的已实施srcset图像响应属性

    WebKit已经发布了一些官方新闻,终于落实srcset的属性.作为W3C的响应图像社区组的主席,我一直希望这一刻到来有一段时间了.所以,对所有参与方是个好消息,用户浏览网页时的体验是最重要的. 所有 ...

  8. CFGym 100198G 题解

    一.题目链接 http://codeforces.com/gym/100198/problem/G 二.题意 看样例就能明白,写表达式解析器. 三 .思路 一看这题目,立马就会想到“后缀表达式”,考虑 ...

  9. python 发送带附件的 邮件

    from email.MIMETextimportMIMETextfrom email.MIMEMultipartimportMIMEMultipartimport smtplib mail_host ...

  10. objects & values & types

    [objects & values & types] 1.Every object has an identity, a type and a value. An object’s i ...