IOS贝塞尔曲线圆形进度条和加载动画
做项目让做一个加载动画,一个圈圈在转中间加一个图片,网上有好多demo,这里我也自己写了一个,中间的图片可加可不加。其中主要用到贝塞尔曲线。UIBezierPath是对CGContextRef的进一步封装,不多说直接上代码:
#import <UIKit/UIKit.h> @interface CircleLoader : UIView //进度颜色 @property(nonatomic, retain) UIColor* progressTintColor ; //轨道颜色 @property(nonatomic, retain) UIColor* trackTintColor ; //轨道宽度 @property (nonatomic,assign) float lineWidth; //中间图片 @property (nonatomic,strong) UIImage *centerImage; //进度 @property (nonatomic,assign) float progressValue; //提示标题 @property (nonatomic,strong) NSString *promptTitle; //开启动画 @property (nonatomic,assign) BOOL animationing; //隐藏消失 - (void)hide; @end
#import "CircleLoader.h" @interface CircleLoader () @property (nonatomic,strong) CAShapeLayer *trackLayer; @property (nonatomic,strong) CAShapeLayer *progressLayer; @end @implementation CircleLoader - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor=[UIColor clearColor]; } return self; } -(void)drawRect:(CGRect)rect { [super drawRect:rect]; _trackLayer=[CAShapeLayer layer]; _trackLayer.frame=CGRectMake(, , self.frame.size.width, self.frame.size.height); _trackLayer.lineWidth=_lineWidth; _trackLayer.strokeColor=_trackTintColor.CGColor; _trackLayer.fillColor = self.backgroundColor.CGColor; _trackLayer.lineCap = kCALineCapRound; [self.layer addSublayer:_trackLayer]; _progressLayer=[CAShapeLayer layer]; _progressLayer.frame=CGRectMake(, , self.frame.size.width, self.frame.size.height); _progressLayer.lineWidth=_lineWidth; _progressLayer.strokeColor=_progressTintColor.CGColor; _progressLayer.fillColor = self.backgroundColor.CGColor; _progressLayer.lineCap = kCALineCapRound; [self.layer addSublayer:_progressLayer]; if (_centerImage!=nil) { UIImageView *centerImgView=[[UIImageView alloc]initWithImage:_centerImage]; centerImgView.frame=CGRectMake(_lineWidth, _lineWidth, self.frame.size.width-*_lineWidth, self.frame.size.height-_lineWidth*); // centerImgView.center=self.center; centerImgView.layer.cornerRadius=(self.frame.size.width+_lineWidth)/; centerImgView.clipsToBounds=YES; [self.layer addSublayer:centerImgView.layer]; } [self start]; } - (void)drawBackgroundCircle:(BOOL) animationing { //贝塞尔曲线 0度是在十字右边方向 -M_PI/2相当于在十字上边方向 CGFloat startAngle = - ((); // 90 Degrees // CGFloat endAngle = ( * ();; CGPoint center = CGPointMake(self.bounds.size.width/, self.bounds.size.height/); CGFloat radius = (self.bounds.size.width - _lineWidth)/; UIBezierPath *processPath = [UIBezierPath bezierPath]; // processPath.lineWidth=_lineWidth; UIBezierPath *trackPath = [UIBezierPath bezierPath]; // trackPath.lineWidth=_lineWidth; //--------------------------------------- // Make end angle to 90% of the progress //--------------------------------------- if (!animationing) { endAngle = (_progressValue * *(float)M_PI) + startAngle; } else { endAngle = (*(float)M_PI) + startAngle; } [processPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; [trackPath addArcWithCenter:center radius:radius startAngle: endAngle:*M_PI clockwise:YES]; _progressLayer.path = processPath.CGPath; _trackLayer.path=trackPath.CGPath; } - (void)start { [self drawBackgroundCircle:_animationing]; if (_animationing) { CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; rotationAnimation.toValue = [NSNumber numberWithFloat:M_PI * 2.0]; rotationAnimation.duration = ; rotationAnimation.cumulative = YES; rotationAnimation.repeatCount = HUGE_VALF; [_progressLayer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; } } - (void)hide { [_progressLayer removeAllAnimations]; [self removeFromSuperview]; } @end
调用:
#import "ViewController.h" #import "CircleLoader.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //设置视图大小 CircleLoader *view=[[CircleLoader alloc]initWithFrame:CGRectMake(, , , )]; //设置轨道颜色 view.trackTintColor=[UIColor redColor]; //设置进度条颜色 view.progressTintColor=[UIColor greenColor]; //设置轨道宽度 view.lineWidth=5.0; //设置进度 view.progressValue=0.7; //设置是否转到 YES进度不用设置 view.animationing=YES; //添加中间图片 不设置则不显示 view.centerImage=[UIImage imageNamed:@"yzp_loading"]; //添加视图 [self.view addSubview:view]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ //视图隐藏 // [view hide]; }); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
效果:
IOS贝塞尔曲线圆形进度条和加载动画的更多相关文章
- 超酷jQuery进度条加载动画集合
在丰富多彩的网页世界中,进度条加载动画的形式非常多样,有利用gif图片实现的loading动画,也有利用jQuery和CSS3实现的进度加载动画,本文主要向大家介绍很多jQuery和CSS3实现的进度 ...
- 用HTML、CSS、JS制作圆形进度条(无动画效果)
逻辑 1.首先有一个圆:蓝色的纯净的圆,效果: 2.再来两个半圆,左边一个,右边一个将此蓝色的圆盖住,效果: 此时将右半圆旋转60°,就会漏出底圆,效果: 然后我们再用一个比底圆小的圆去覆盖这个大 ...
- CSS3 Loading进度条加载动画特效
在线演示 本地下载
- CSS3彩色进度条加载动画 带进度百分比
在线演示 本地下载
- 基于CAShapeLayer和贝塞尔曲线的圆形进度条动画
通过CAShapeLayer和贝塞尔曲线搭配的方法,创建的简单的圆形进度条的教程先简单的介绍下CAShapeLayer1,CAShapeLayer继承自CALayer,可使用CALayer的所有属性2 ...
- 基于CAShapeLayer和贝塞尔曲线的圆形进度条动画【装载】
初次接触CAShapeLayer和贝塞尔曲线,看了下极客学院的视频.对初学者来说感觉还不错.今天来说一个通过CAShapeLayer和贝塞尔曲线搭配的方法,创建的简单的圆形进度条的教程先简单的介绍下C ...
- iOS之UI--Quartz2D的入门应用--重绘下载圆形进度条
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- [iOS]圆形进度条及计时功能
平时用战网安全令的时候很喜欢圆形倒计时的效果,然后简单看了一下Android的圆形进度条,后来又写了一个IOS的.整体界面参照IOS系统的倒计时功能,顺便熟悉了UIPickerView的一些特性的实现 ...
- IOS 圆形进度条
// // CCProgressView.h // Demo // // Created by leao on 2017/8/7. // Copyright © 2017年 zaodao. All r ...
随机推荐
- Selenium框架切换-----Selenium快速入门(七)
上一篇说了窗口的切换,本篇说说框架的切换. 切换框架:是指切换html中的iframe标签元素或者frame标签元素,注意,并不包括frameset 以下是常用的方法: 方法 说明 WebDriver ...
- sql server还原到指定时间
BACKUP LOG yjxy_1010 TO DISK='d:\yixy_log.bak' WITH FORMAT 数据库右击->任务->还原->还原事务日志.
- C#基础之流程控制语句详解
C#程序的执行都是一行接一行.自上而下地进行,不遗漏任何代码.为了让程序能按照开发者所设计的流程进行执行,必然需要进行条件判断.循环和跳转等过程,这就需要实现流程控制.C#中的流程控制包含了条件语句. ...
- C# Winform WPF DeskBand 窗体嵌入任务栏,在任务栏显示文字
最近写了个小程序,用于将固态硬盘的写入量等信息显示在任务栏,最开始使用Windows API也可以实现,但是当任务栏托盘增加的时候,会被遮盖,最终采用了DeskBand来实现,填了很多坑. 参考的Gi ...
- python网络编程--操作系统介绍
1.操作系统介绍 操作系统位于计算机硬件与应用软件之间,本质也是一个软件.操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两 ...
- 【Oracle 12c】最新CUUG OCP-071考试题库(60题)
60.(16-10) choose the best answer: Evaluate the following SQL commands: SQL>CREATE SEQUENCE ord_s ...
- junit启动tomcat来进行单元测试
1.pom.xml配置下载需要的jar. <dependency> <groupId>junit</groupId> ...
- vue 中的computed和watch
计算属性 通过计算得来的属性 computed:是一个计算属性,用来监听属性的变化 computed里面的方法调用的时候是不需要加() 另外里面的方法必须要有一个返回值 computed里面的方法 ...
- 如何使用robots禁止各大搜索引擎爬虫爬取网站
ps:由于公司网站配置的测试环境被百度爬虫抓取,干扰了线上正常环境的使用,刚好看到每次搜索淘宝时,都会有一句由于robots.txt文件存在限制指令无法提供内容描述,于是便去学习了一波 1.原来一般来 ...
- 核心API的使用(给定一个字符串,统计每个字符出现的次数)
/** * 给定一个字符串,统计每个字符出现的次数. 如:abdaewrwqask435a1aasd */public class ReplaceString { static int length; ...