zoukankan      html  css  js  c++  java
  • 使用Quarz2D 绘制进度条

    一直觉得iphone系统自带的进度条有点简陋,由于项目的实际需要,我参考了一些资料,自己绘制了一个进度条,主要使用Quarz2D来实现的。  绘制矩形,填充内部颜色,描边,然后从左侧往右侧逐渐改变填充颜色,最后的效果就是一个动态的进度条实现了。

    首先是头文件:CustomProgressView.h

    //  Created by suruqiang on 8/4/10.
    //  Copyright 2010 __MyCompanyName__. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    
    @interface CustomProgressView : UIView {
    
    	float progress;
    }
    
    @property(assign, nonatomic) float progress;
    -(id) init;
    //-(void)drawRect:(CGRect)_rect borderRadius:(CGFloat)_rad borderWidth:(CGFloat)_thickness barRadius:(CGFloat)_barRadius barInsert:(CGFloat)_barInsert;
    -(void) drawRect:(CGRect)rect borderRadius:(CGFloat)rad borderWidth:(CGFloat)thickness barRadius:(CGFloat)barRadius barInset:(CGFloat)barInset;
    @end
    
    

    CustomProgressView.m文件实现代码:

    //  Created by suruiqiang on 8/4/10.
    //  Copyright 2010 __MyCompanyName__. All rights reserved.
    //
    
    #import "CustomProgressView.h"
    
    
    @implementation CustomProgressView
    @synthesize progress;
    
    
    
    -(id) init
    {
    	CGRect rect = CGRectMake(0, 0, 210, 20);
    	//if(![super initWithFrame:rect])
    	//	return nil;
    	[super initWithFrame:rect];
    	progress = 0;
    	self.backgroundColor = [UIColor clearColor];
    	
    	return self;
    }
    
    
    -(void)setProgress:(float)_progress
    {
    	_progress = MIN(MAX(0,_progress),1);
    	if(_progress==progress)
    		return;
    	progress = _progress;
    	
    	[self setNeedsDisplay];
    }
    
    
    
    - (void) drawRect:(CGRect)rect
    {
    	[self drawRect:rect borderRadius:8. borderWidth:2. barRadius:5. barInset:3.];
    }
    
    
    -(void) drawRect:(CGRect)rect borderRadius:(CGFloat)rad borderWidth:(CGFloat)thickness barRadius:(CGFloat)barRadius barInset:(CGFloat)barInset{
    	//draw the outside rectangle of custom progressview
    	CGContextRef context = UIGraphicsGetCurrentContext();
    	CGRect rrect = CGRectInset(rect,thickness, thickness);
    	CGFloat radius = rad;
    	CGFloat minx = CGRectGetMinX(rrect), midx = CGRectGetMidX(rrect), maxx = CGRectGetMaxX(rrect);
    	CGFloat miny = CGRectGetMinY(rrect), midy = CGRectGetMidY(rrect), maxy = CGRectGetMaxY(rrect);
    	CGContextMoveToPoint(context, minx, midy);
    	CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
    	CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
    	CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
    	CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);
    	CGContextClosePath(context);
    	CGContextSetRGBStrokeColor(context, 0, 1, 1, 1);
    	//CGContextSetRGBFillColor(context,1, 1, 1, 1);
    	CGContextSetLineWidth(context, thickness);
    	CGContextDrawPath(context, kCGPathStroke);
    
    	radius = barRadius;
    	
    	rrect = CGRectInset(rrect, barInset, barInset);
    	rrect.size.width = rrect.size.width * self.progress;
    	minx = CGRectGetMinX(rrect), midx = CGRectGetMidX(rrect), maxx = CGRectGetMaxX(rrect);
    	miny = CGRectGetMinY(rrect), midy = CGRectGetMidY(rrect), maxy = CGRectGetMaxY(rrect);
    	CGContextMoveToPoint(context, minx, midy);
    	CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
    	CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
    	CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
    	CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);
    	CGContextClosePath(context);
    	CGContextSetRGBFillColor(context,1, 0, 1, 1);
    	CGContextDrawPath(context, kCGPathFill);
    	
    }
    
    - (void)viewDidUnload {
    	// Release any retained subviews of the main view.
    	// e.g. self.myOutlet = nil;
    }
    
    
    - (void)dealloc {
        [super dealloc];
    }
    
    
    @end
    
    

    调用出的代码如下:

    - (void)viewDidLoad {
        [super viewDidLoad];
    //[self.view addSubview:[self progressBar]];
    	progressBar = [[CustomProgressView alloc] init];
    	progressBar.center = CGPointMake(160.0f, 160.0f);
    	[progressBar setProgress:0.01];
    	[self.view addSubview:progressBar];
    	
    	
    	time = 0;
    	timer = [[NSTimer timerWithTimeInterval:0.02 target:self selector:@selector(timer) userInfo:nil repeats:YES] retain];
    	[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    
    
    }
    
    
    -(void)timer
    {
    	self.progressBar.progress = time / 100.0;
    	
    	time++;
    	if(time > 130) time = -30;
    	return;
    }
    
    
    由于本人只是潦草的绘制了一番,没有任何美工元素,实际项目中需要对颜色等进行设置优化。


  • 相关阅读:
    SpringCloud学习笔记(5)——Config
    SpringCloud学习笔记(4)——Zuul
    SpringCloud学习笔记(3)——Hystrix
    SpringCloud学习笔记(2)——Ribbon
    SpringCloud学习笔记(1)——Eureka
    SpringCloud学习笔记——Eureka高可用
    Eureka介绍
    微服务网关 Spring Cloud Gateway
    Spring Boot 参数校验
    Spring Boot Kafka
  • 原文地址:https://www.cnblogs.com/moshengren/p/1855984.html
Copyright © 2011-2022 走看看