Swift:使用CAShapeLayer打造一个ProgresssBar

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) / 2 - 30.0, startAngle: startAngle, endAngle: endAngle, clockwise: true)

bounds是:

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

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

来看看全部的代码:

        var progressLayer = CAShapeLayer()
        progressLayer.frame = bounds
        progressLayer.path = UIBezierPath(arcCenter: centerPoint, radius: CGRectGetWidth(bounds) / 2 - 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")

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

时间: 2024-08-30 03:16:43

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

Android 从无到有打造一个炫酷的进度条效果

从无到有打造一个炫酷的进度条效果

Android高级控件(五)——如何打造一个企业级应用对话列表,以QQ,微信为例

Android高级控件(五)--如何打造一个企业级应用对话列表,以QQ,微信为例 看标题这么高大上,实际上,还是运用我么拿到listview去扩展,我们讲什么呢,就是研究一下QQ,微信的这种对话列表,我们先看一个传统的ListView是怎么样的,我们做一个通讯录吧,通讯录的组成就是一个头像,一个名字,一个电话号码,一个点击拨打的按钮,既然这样,那我们的item就出来了 call_list_item.xml <?xml version="1.0" encoding="ut

如何打造一个伟大的产品4 - 如何驾驭三个木桶模型

如何驾驭三个木桶模型 打造一个产品最考技巧的是需要去学习究竟如何才能把一个产品的各个功能点进行分门别类的放到"三个木桶模型"里面的三个木桶里面,然后还要知道什么时候这些木桶是已经装满了.返回之前提过的一个例子,究竟一个内嵌的投影模块对手机产品来说是属于gamechangers级别的功能还是distractions级别的功能呢?如果是gamechangers级别的话,那么这个功能是否已经足够捕获大量用户的芳心呢?或者你还需要结合另外一个gamechangers级别的功能才能做到这一点呢?

如何打造一个伟大的产品7 - 产品使命验证法

产品使命验证法 假设你现在已经可以将你已建立好的对产品的直觉用来把"三个木桶模型"应用到你所处的行业中,你已经可以轻易(且正确地)把功能点归类到不同的木桶里面,那么你已经比大部分产品经理优秀了.但,这还不够.你要知道这个方法其实是存在一定的瑕疵的: 如果你仅仅是通过凭空臆测的直觉来对功能点进行分类的话,那么你将很容易在犯错误之后,被你脑海中另一把声音的花言巧语所说服而自以为做了个正确的决定. 当你在打造该产品的时候,你势必需要对每个大大小小的决定都事必躬亲,因为其他人根本没有东西作为指

如何打造一个伟大的产品6 - 聚合性gamechangers功能点不可取

聚合性gamechangers功能点不可取 这里开始讨论下我们之前没有讨论过的关于"三个木桶模型"的一些微妙之处.有些独立的功能点自身其实并没有足够的吸引力的,但是一旦和其他功能点聚合在一起就会立刻摇身一变成为gamechangers级别的功能.比如,假设你现在在为你的手机产品设计一套图的的图片.这会是一个gamechangers级别的功能点吗?很有可能不是.那么单独的一套独特的漂亮颜色组合模版呢?这看起来也不像是一个gamechangers级别的功能.那么配套上一个独特类型的手机外壳

如何打造一个伟大的产品1 - 引言

关于作者 我叫Slava Akhmechet,本人是 RethinkDB 的创始人之一,RethinkDB是一个设计来帮助开发者和运营团队来处理无结构数据的一个开源的分布式数据库,用户可以使用它来作为数据库来打造自己的应用. 如何打造一个伟大的产品 26 Sep 2013 如果你深信销售就是你产品成功的制胜法宝的话,那么如果我说大部分初创企业在还没有把它们伟大的产品推向市场进行销售之前就已经把钱给烧光而铩羽而归的话,元芳,你怎么看呢?假如你面向的是一个爆炸性快速增长的市场,你需要找到一个打造一个

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

打造一个很简单的文档转换器 - 使用组件 Spire.Office 目录 Spire.Office 介绍 库引用 界面预览 代码片段 Spire.Office 介绍 关于 Spire.Office,它是一个专门为开发人员创建,读取,写入设计的库,转换和从打印 word 文档文件.作为一个独立的 .NET组件,它不需要在机器上安装微软的 Word 等办公软件.然而,它可以将微软的“文档创建功能”集成到任何开发人员的网络应用程序中.它是一个可靠的 MS Word 的API,可以执行许多Word文档处

Cocos2d-x 3.0 打造一个全平台概念文件夹

Cocos2d-x 3.0 打造一个全平台概念文件夹http:// www.eoeandroid.com/thread-328055-1-1.html

从零开始打造一个Android 3D立体旋转容器

本文地址,转载请注明 http://blog.csdn.net/mr_immortalz/article/details/51918560 嗯,2个月没有写博客,是要好好反省下,趁着放暑假把这两个月看的东西好好沉淀下.嗯,就立下这个Flag,希望不要自己再打自己脸. 1.概述 回到正题,这次带来的效果,是一个Android 的3D立体旋转的效果. 当然灵感的来源,来自早些时间微博上看到的效果图. 非常酷有木有!作为程序猿我当然要把它加入我的下一个项目中啦! 原效果 我们实现的效果: (为了更加可