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(0, 0, 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(0, 0, 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-2*_lineWidth, self.frame.size.height-_lineWidth*2);
//        centerImgView.center=self.center;centerImgView.layer.cornerRadius=(self.frame.size.width+_lineWidth)/2;centerImgView.clipsToBounds=YES;[self.layer addSublayer:centerImgView.layer];}[self start];
}- (void)drawBackgroundCircle:(BOOL) animationing {//贝塞尔曲线 0度是在十字右边方向   -M_PI/2相当于在十字上边方向CGFloat startAngle = - ((float)M_PI / 2); // 90 Degrees//
    CGFloat endAngle = (2 * (float)M_PI) + - ((float)M_PI / 8);;CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);CGFloat radius = (self.bounds.size.width - _lineWidth)/2;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 * 2*(float)M_PI) + startAngle;}else{endAngle = (0.1 * 2*(float)M_PI) + startAngle;}[processPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES];[trackPath addArcWithCenter:center radius:radius startAngle:0 endAngle:2*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 = 1;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(100, 100, 70, 70)];//设置轨道颜色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)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{//视图隐藏
//        [view hide];
    });}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}@end

效果:

转载于:https://www.cnblogs.com/5ishare/p/4810437.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CM3计算板EC20模组拨号上网

1、安装 ppp 安装ppp&#xff1a;sudo apt-get install ppp 2、配置路由 查看路由和网卡 ifconfig ; route -n增加路由设备&#xff1a; sudo route add default dev ppp0 3、执行拨号脚本 进入linux-ppp-scripts 文件下&#xff1a;sudo ./quectel-pppd.sh /dev/ttyUSB3 …

CM3计算板I/O编程

1、CM3计算板的IO资源 CM3支持的I/O管脚数为54个&#xff0c;每个管脚包括一个或多个复用功能&#xff0c;分别位于ALT0~ALT5&#xff0c;如下表&#xff1a; 2、设备树启用IO外设的方式 通过在/boot/config.txt 文件中描述IO行为&#xff0c;可以在系统启动时&#xff0c;初…

python类型转换、数值操作

From: http://canofy.iteye.com/blog/298263 python类型转换 Java代码 函数 描述 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ) 将x转换到一个浮点数 complex(real [,imag ]…

Bloomfilter 的应用场景

Bloomfilter 一般用于检测某元素是否在集合中存在&#xff0c;它的目标是解决在大数据量情况的元素判定。它的优点是它提供的数据结构具有非常高的时间查询和空间存储效率&#xff0c;缺点是可能造成误判&#xff0c;就是说&#xff0c;它判定某元素在集合中&#xff0c;但是其…

运放搭建的窗口电压比较器电路

1、窗口比较器 设输入电压为Vin&#xff0c;输入范围为&#xff08;-V1~V2&#xff09;&#xff0c;要求设计电路识别输入是否在给定的电压区间&#xff08;Vd~Vt&#xff09;。 可以设计为一个电压窗口比较电路&#xff0c;窗口电压VwVsδ&#xff0c;Vs为窗口基准电压&…

ImageView倒影效果

先看下效果图&#xff1a;import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.LinearGradient; import android.graphi…

USB连接TF卡 SD卡硬件电路

1、电路芯片 TF卡芯片选择&#xff1a;GL823K。USB2.0 SD/MMC闪存读卡器单芯片。支持USB2.0高速传输&#xff0c;并符合通用串行总线规范。 它的引脚设计适合卡插口提供更容易的PCB布局。 TF卡防静电芯片&#xff1a;SMF05C。 2、电路 分享实际项目中用到的接口电路&#…

R语言-Kindle特价书爬榜示例 输出HTML小技巧

20170209更新&#xff1a; 根据回复提示&#xff0c;rvest包更新&#xff0c;原用函数html作废&#xff0c;需改用read_html 并后续amazon网页改版等 因此此文章代码失效&#xff01;各位可看评论内容了解详情 等以后有空再重写一遍代码&#xff0c;抱歉。果然代码还是放在gith…

工业RS485接口电路设计

1、电路芯片 485芯片有很多种&#xff0c;项目中用的比较多的是高速SP3485。满足RS-485和RS-422串行协议的要求&#xff0c;兼容工业标准规范&#xff0c;数据传输速率可高达10Mbps&#xff08;带负载&#xff09;。 2、工业设计 485需要做防雷考虑、瞬态过电压抑制、阻抗匹配…

MyBatis学习笔记(一)——MyBatis快速入门

转自孤傲苍狼的博客&#xff1a;http://www.cnblogs.com/xdp-gacl/p/4261895.html 一、Mybatis介绍 MyBatis是一个支持普通SQL查询&#xff0c;存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简…

一个USB HUB电路分享

1、USB HUB 当USB接口不够用的时候&#xff0c;可以采用USB HUB电路进行扩展&#xff0c;将一个USB接口扩展为多个&#xff0c;并可以使这些接口同时使用的装置。USB HUB根据所属USB协议可分为USB2.0 HUB、USB3.0 HUB与USB3.1 HUB。 选用的USB HUB芯片为 USB2514B. 参考文档&…

RIP、 OSPF、 EIGRP的区别

我们前面已经简单介绍了三种类型的动态路由协议算法分别是距离矢量算法&#xff0c;链路状态算法以及平衡混合算法&#xff0c;那么咱们今天就来看看这几种算法的类型代表&#xff1a;RIP、OSPF、EIGRP。而且它们都是内部网关协议&#xff08;IGP&#xff09;&#xff0c;也就是…

GDI+ 设置不同的分辨率来显示不同大小的图片

通过改变内存图像的分辨率来改变图像在屏幕的大小。 原理是&#xff1a;屏幕的大小/图像&#xff08;内存的图像&#xff09;的大小 屏幕的分辨率/图像&#xff08;内存的图像&#xff09;的分辨率。 注意&#xff1a;当图像的分辨率率变大时&#xff0c;图像本身的像素点的大小…

关于UILabel

一&#xff1a;创建一个label UILabel *label [[UILabel alloc]initWithFrame:CGRectMake(15, 100, 345, 100)]; 二&#xff1a;UILabel的一些属性 (1) 设置文字&#xff1a;label.text "这是我的一个Label"; (2) 设置文字颜色&#xff1a;label.textColor [UIC…

CM3计算板安装硬件时钟DS3231

1、硬件连接 DS3231是高速&#xff08;400kHz&#xff09;I2C接口的实时时钟芯片&#xff0c;0C至40C范围内精度为2ppm&#xff0c;-40C至85C范围内精度为3.5ppm&#xff0c;工作电压3.3V&#xff0c;提供电池备份&#xff0c;具有输入低功耗&#xff0c;实时时钟产生秒、分、…

初识JavaScript———JavaScript注意事项(1)

javascript能实现高级编程语言所不能实现的效果。javascript区分大小写。 JS能单独写在一个文件上&#xff0c;文件后缀为JS。JS文件不能直接运行&#xff0c;需嵌入到HTML文件中执行&#xff0c;我们需在HTML中添加如下代码&#xff0c;就可将JS文件嵌入HTML文件中。 <scri…

Source Insight(vs2012,ultraedit) 中Tab键设置为4个空格代替

From: http://blog.csdn.net/wfdtxz/article/details/8520629 Source insight中显示TAB符用4个空格代替 Options->Document Options 将 Visible tabs 打勾 - Source insight中将输入的TAB符转换为空格: 1. Options->Document Options 将 Expand Tabs 打勾2. TAB符宽度…

虚拟机性能测试:八 性能分析—Windows体验指数

先上总分&#xff0c;由于Windows VitualPC不支持Windows体验指数评分&#xff0c;所以它的分数为0。 通过对比发现除了vmware对图形处理的较好外&#xff0c;其它的虚拟机图形的处理都不怎么样。这也是影响体验指数的主要原因。其他的还是差别不大的。转载于:https://blog.51c…

java servlet+oracle 新手可看

最近公司领导告诉接下去接的一个产品&#xff0c;可能会涉及到oracle数据库&#xff0c;以前用得最多的是mssql,前些时间学了下mysql也算少许用过。oracle没接触过。应为我之前做过.net开发&#xff0c;所以数据访问接口这块&#xff0c;涉及到的ashx wcf webserver这些&#x…

Forms身份验证基本原理

要采用Forms身份验证&#xff0c;先要在应用程序根目录中的Web.config中做相应的设置: <authentication mode"forms"> <forms name".ASPXAUTH " loginUrl"/login.aspx" timeout"30" path "/"> </form…