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 ...
随机推荐
- 记在WEBAPI中AutoMapper的初使用方法
很早就听说AutoMapper了.这些天一直在写api接口,发现之前的类型转换有点问题,就想到了用AutoMapper.用作DTO转换工具. 废话不多说,直接开些代码 首先 在Vs中找到 工具--- ...
- roadflow asp.net工作流自定义表单
在roadflow表单设计器不能满足很复杂的业务需求的时候,可以采用自定义表单(即表单页面自己做). 自定义表单就是自己写一个页面,包含控制器视图,然后将这个页面挂到流程上进行审批. 自定义表单分为以 ...
- Exp2 后门原理与实践 20164323段钊阳
220164323 Exp2 后门原理与实践 (1)例举你能想到的一个后门进入到你系统中的可能方式?在使用盗版软件,盗版系统,甚至游戏外挂时,往往会让我们关闭杀毒软件,.(2)例举你知道的后门如何启动 ...
- Spring中 使用注解+c3p0+事物 《模拟银行转账》
使用注解的方式 模拟转账 要么都成功 要么都失败 !保持一致性! 准备工作: jar包: 需要的类: UserDao: package com.hxzy.spring.c3p0.Dao ...
- 无法启动DISTRIBUTED TRANSACTION COORDINATOR解决方法
有时候我们需要进行COM应用程序的权限设置,控制面板-->管理工具-->组件服务-->然后依此展开:组件服务-->计算机-->我的电脑-->DCOM 配置,接下来找 ...
- java使用Redis6--sentinel单点故障主从自动切换
Redis SentinelSentinel(哨兵)是用于监控redis集群中Master状态的工具,其已经被集成在redis2.4+的版本中 一.Sentinel作用:1):Master状态检测 2 ...
- 总结day13 ----内置函数
内置函数 我们一起来看看python里的内置函数.什么是内置函数?就是Python给你提供的,拿来直接用的函数,比如print,input等等.截止到python版本3.6.2,现在python一共为 ...
- 定期删除Azure存储账号下N天之前的数据文件-ASM
######RemoveStorageBlob*DaysOld##### <# .SYNOPSIS Remove all blob contents from one storage accou ...
- HTML01--基础概述
HTML:Hyper Text Markup Language,超文本标记语言,不是编程语言,而是标记语言,使用一套标记标签来描述网页.通常来说,我们平时打开浏览器看到的网页由三部分组成,分别是HTM ...
- 【面向对象】【prototype&&__proto__&&实例化对象三者之间的关系】
1.构造函数 a.什么是构造函数? 解释:通过关键字new 创建的函数叫做构造函数 作用:用来创建一个对象 废话少说直接上代码,首先我们还是创建一个构造函数人类 然后我们在创建两个实例,一个凡尘 一个 ...