前几天用UC浏览器看新闻(无意中给UC打了广告),看到它的图片加载进度条,正好最近有时间,所以就自己写了一个。

效果图如下

进度条的底色和填充颜色都可以调整。

首先中间的笑脸作为一个整体,其实现代码如下:

#import "FaceView.h"

@implementation FaceView
- (instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor clearColor];
}
return self;
}
- (void)drawRect:(CGRect)rect{
CGFloat width = rect.size.width;
CGFloat height = rect.size.height;
CGContextRef context=UIGraphicsGetCurrentContext();
//眼睛
CGFloat eyeRadius = width * 0.1;
CGFloat factor_eyeX = 0.3;
CGFloat factor_eyeY = 0.2;
CGPoint leftEyeCenter = CGPointMake(width * factor_eyeX, height * factor_eyeY);
CGPoint RightEyeCenter = CGPointMake(width - width * factor_eyeX, height * factor_eyeY);
CGContextAddArc(context, leftEyeCenter.x, leftEyeCenter.y, eyeRadius, , M_PI * , );
CGContextAddArc(context, RightEyeCenter.x, RightEyeCenter.y, eyeRadius, , M_PI * , ); if (_faceColor) {
[_faceColor set];
} CGContextDrawPath(context, kCGPathFill);
//嘴
CGFloat factor_pX = 0.15;
CGFloat factor_pY = 0.6; CGFloat factor_cX = 0.5;
CGFloat factor_cY = 0.8; CGPoint startPoint = CGPointMake(width * factor_pX, height * factor_pY);
CGPoint endPoint = CGPointMake(width - width * factor_pX, height * factor_pY);
CGPoint controlPoint = CGPointMake(width * factor_cX, height * factor_cY);
//贝塞尔曲线
CGContextMoveToPoint(context, startPoint.x, startPoint.y);
CGContextAddQuadCurveToPoint(context, controlPoint.x, controlPoint.y, endPoint.x, endPoint.y);
CGContextSetLineWidth(context, 2.0);
CGContextDrawPath(context, kCGPathStroke); }
- (void)setFaceColor:(UIColor *)faceColor{
_faceColor = faceColor;
[self setNeedsDisplay];
}
- (void)dealloc{
LogFunc;;
}

接下来就是路径的绘制代码如下:

#define RGBColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
#define grayColor RGBColor(138, 138, 138)
#import "YXProgressView.h"
#import "FaceView.h"
@interface YXProgressView () @property (nonatomic,assign) CGFloat rectRadius;
@property (nonatomic,assign) CGFloat lineWidth;
@property (nonatomic,assign) CGFloat myFaceViewInset;
@property (nonatomic,strong) CAShapeLayer *progressLayer;
@property (nonatomic,strong) CAShapeLayer *outLayer;
@property (nonatomic,strong) FaceView *myFaceView;
@property (nonatomic,strong) NSTimer *animatedTimer;
@property (nonatomic,assign) NSTimeInterval timeInterval;
@end
@implementation YXProgressView
- (instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor clearColor];
self.isAnimated = YES;
self.actionLineColor = [UIColor whiteColor];
self.fixedLineColor = grayColor; CGFloat width = frame.size.width;
self.myFaceViewInset = width * 0.15;
self.rectRadius = width * 0.2;
self.lineWidth = 3.0;
self.timeInterval = 2.0; self.myFaceView = [FaceView new];
self.myFaceView.faceColor = self.fixedLineColor;
[self addSubview:self.myFaceView]; self.outLayer = [CAShapeLayer layer];
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:self.rectRadius];
self.outLayer.strokeColor = self.fixedLineColor.CGColor;
self.outLayer.lineWidth = _lineWidth;
self.outLayer.fillColor = [UIColor clearColor].CGColor;
self.outLayer.lineCap = kCALineCapRound;
self.outLayer.path = path.CGPath;
[self.layer addSublayer:self.outLayer]; self.progressLayer = [CAShapeLayer layer];
self.progressLayer.frame = self.bounds;
self.progressLayer.fillColor = [UIColor clearColor].CGColor;
self.progressLayer.strokeColor = self.actionLineColor.CGColor;
self.progressLayer.lineWidth = _lineWidth;
self.progressLayer.lineCap = kCALineCapRound;
self.progressLayer.path = path.CGPath;
[self.layer addSublayer:_progressLayer]; self.progress = ; }
return self;
}
- (void)willMoveToSuperview:(UIView *)newSuperview{
if (self.isAnimated) {
_animatedTimer = [NSTimer scheduledTimerWithTimeInterval:_timeInterval target:self selector:@selector(animation) userInfo:nil repeats:YES];
[_animatedTimer fire];
[[NSRunLoop mainRunLoop] addTimer:_animatedTimer forMode:NSRunLoopCommonModes];
} }
- (void)removeFromSuperview{
[super removeFromSuperview];
[_animatedTimer invalidate];
_animatedTimer = nil;
LogFunc;
}
- (void)dealloc{
LogFunc;
}
- (void)animation{
__weak typeof(self) weakSelf = self;
CGRect tempF = weakSelf.myFaceView.frame;
tempF.origin.y = * _myFaceViewInset - _myFaceViewInset * 0.5;
[UIView animateWithDuration:weakSelf.timeInterval * 0.5 animations:^{
weakSelf.myFaceView.frame = tempF;
} completion:^(BOOL finished) {
CGRect tempF_= weakSelf.myFaceView.frame;
tempF_.origin.y = weakSelf.myFaceViewInset * 0.5;
[UIView animateWithDuration:weakSelf.timeInterval * 0.5 animations:^{
weakSelf.myFaceView.frame = tempF_;
}]; }];
}
- (void)setActionLineColor:(UIColor *)actionLineColor{
_actionLineColor = actionLineColor;
self.progressLayer.strokeColor = self.actionLineColor.CGColor;
}
- (void)setFixedLineColor:(UIColor *)fixedLineColor{
_fixedLineColor = fixedLineColor;
self.outLayer.strokeColor = self.fixedLineColor.CGColor;
}
- (void)setProgress:(CGFloat)progress{
if (progress<) {
progress = ;
}
if (progress>) {
progress = ;
}
_progress = progress;
self.progressLayer.strokeEnd = progress;
} - (void)layoutSubviews{
[super layoutSubviews];
_myFaceView.frame = CGRectInset(self.bounds, _myFaceViewInset, _myFaceViewInset);
}

我把源码上传到了GitHub,大家下载之后可以直接使用,非常方便。地址在这 https://github.com/CoderPaulYin/YXProgressView.git

基本的使用举例:

 _myProgressView = [[YXProgressView alloc] initWithFrame:CGRectMake(, , , )];
_myProgressView.centerX = self.view.centerX;
_myProgressView.actionLineColor = [UIColor greenColor];//设置进度条的填充颜色,也可以设置其他颜色
[self.view addSubview:_myProgressView];

然后在其他需要更新进度的地方:

- (void)sliderValueChanged:(UISlider *)sender{
NSLog(@"%f",sender.value);
_myProgressView.progress = sender.value;
}

我的QQ:82154139  GitHub:  https://github.com/CoderPaulYin

欢迎加我好友交流,互相学习。

仿UC浏览器图片加载进度条的更多相关文章

  1. react封装简单的浏览器顶部加载进度条全局组件

    在项目中经常会有在请求前后加loading或者加加载进度条,一般这些组件都会抽离出来作为全局组件 进度条的插件貌似都不是很符合自己项目中的需求,于是.. 参考nprogress样式,自己在项目中封装组 ...

  2. ios的uc浏览器图片加载不出来原因

    最近做一个落地页发现一个在ios设备上uc浏览器的bug 在uc浏览器开启广告过滤的时候,会把图片过滤掉,无论是背景图还是img标签加载的图片 经过搜索与实验,发现广告过滤的设置关掉就可以,可是一般情 ...

  3. js实现页面图片加载进度条

    //html <div id="loading" class="loading"> <div class="load"&g ...

  4. css3 linear-gradient实现页面加载进度条效果

    最终效果图: html结构: <div>    <p class="p1">        <span></span>    < ...

  5. 【Web前沿技术】纯 CSS3 打造的10个精美加载进度条动画

    之前向大家介绍8款优秀的 jQuery 加载动画和进度条插件,今天这篇文章向大家推荐10个纯 CSS3 代码实现精美加载进度条动画效果的方案.加载动画和进度条在网站和 Web 应用中的使用非常流行,特 ...

  6. 混合开发(一)——WebView开发高级技巧之加载网页以及JavaScript,加载进度条

    混合开发(一)--WebView开发高级技巧之加载网页以及JavaScript,加载进度条 现在关于混合开发也越来越多了,很多人喜欢跟随,比如HB,比如RN,其实这东西很早就有这么一个概念了,而且说实 ...

  7. Unity3D 场景切换加载进度条实现

    需要三个场景,场景A,场景B,场景C: 场景A:一个按钮,点击加载场景B: 场景B:从A切换到C过度场景,加载进度条: 场景C:目标场景: 创建OnProgress.cs脚本: using Syste ...

  8. vue使用nprogress页面加载进度条

    vue使用nprogress页面加载进度条 NProgress是页面跳转是出现在浏览器顶部的进度条 官网:http://ricostacruz.com/nprogress/ github:https: ...

  9. iOS WKWebView 加载进度条、导航栏返回&关闭 (Swift 4)

    导航: 1.加载进度条 2.导航栏增加返回.关闭按钮 加载进度条 效果图 代码如下: self.progressView.trackTintColor = UIColor.white self.pro ...

随机推荐

  1. 《Genesis-3D开源游戏引擎-官方录制系列视频教程:进阶实例篇》

    注:本系列教程仅针对引擎编辑器:v1.2.2及以下版本 G3D进阶实例   第四课<2D编辑与脚本的统一入口> 使用G3D完成一个简单的类飞机大战游戏,介绍了G3D2d游戏制作的流程包括: ...

  2. linux 和 android 源码的 cross reference (即网页浏览代码的引用)

    linux: http://lxr.free-electrons.com/               相当好 android: http://androidxref.com

  3. SAE 合并图片

    $domain = 'picleader'; //图片库的域名 $stgurl = 'http://lemonluoxing-picleader.stor.sinaapp.com/'; //绝对路径 ...

  4. 对"一维最大子数组和"问题的思考(homework-01)

    一维最大子数组和问题,即给定一个数组,在它所有的连续子数组的和中,求最大的那个和.“最大子数组和”是一个很好的IT面试考题,在<编程之美>一书中同时阐述了一维数组和二维数组的讨论.本篇博客 ...

  5. Spark SQL应用

    Spark Shell启动后,就可以用Spark SQL API执行数据分析查询. 在第一个示例中,我们将从文本文件中加载用户数据并从数据集中创建一个DataFrame对象.然后运行DataFrame ...

  6. 转载 JQuery.data()方法学习

    转载原地址  http://hanchaohan.blog.51cto.com/2996417/1271551 转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.ht ...

  7. Object类、instanceof

    一.Object 1.所有类都默认继承至Object 2.两个常用的方法 2.1.toString:返回类的字符串描述,一般子类会重写用来打印属性 2.2.equals:默认比较两个对象的引用是否相同 ...

  8. Autofac介绍

    原帖:http://www.cnblogs.com/xupng/archive/2011/07/12/2104766.html Autofac为何物?它是.NET世界里现存的几种IOC框架其中之一,传 ...

  9. C++中标准容器Vector,元素操作.insert()小结

    insert() 函数有以下三种用法: iterator insert( iterator loc, const TYPE &val );  //在指定位置loc前插入值为val的元素,返回指 ...

  10. 使用Github遇到的问题及解决办法

    问题一: 当push代码上去仓库时,出现 ! [rejected]        master -> master (fetch first) error: failed to push som ...