iOS开发(OC)——折线图的绘制(带动画)
来源:互联网 发布:美国直播软件 编辑:程序博客网 时间:2024/05/01 06:45
- 新建一个DrawLine类继承UIView
- DrawLine.h代码
@property (nonatomic,strong)NSMutableArray *data;@property (nonatomic, strong) CAShapeLayer *lineChartLayer;@property (nonatomic, strong)UIBezierPath * path1;/** 渐变背景视图 */@property (nonatomic, strong) UIView *gradientBackgroundView;/** 渐变图层 */@property (nonatomic, strong) CAGradientLayer *gradientLayer;/** 颜色数组 */@property (nonatomic, strong) NSMutableArray *gradientLayerColors;@property (nonatomic,assign)int ySpace;//y轴间隔@property (nonatomic,assign)int yNum;//y轴的分点数@property (nonatomic,assign)int xSpace;//x轴间隔@property (nonatomic,assign)int xNum;//x轴的分点数@property (nonatomic,strong)NSString *ytitle;//y轴标题@property (nonatomic,strong)NSString *xtitle;//x轴标题@property (nonatomic,assign)BOOL showNum;//显示数值//建立坐标-(void)initCoordinate;//开始画图-(void)beginDraw;
3.DrawLine.m代码
- (instancetype)initWithFrame:(CGRect)frame{ if (self = [super initWithFrame:frame]) { self.backgroundColor = [UIColor whiteColor]; [self drawGradientBackgroundView]; } return self;}-(void)initCoordinate{ //y轴// UIView *view=[[UIView alloc] initWithFrame:CGRectMake(50, 15, 1, self.frame.size.height-60)];// view.backgroundColor=[UIColor lightGrayColor];// [self addSubview:view]; UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(70, 10, 150, 21)]; label.text=self.ytitle; label.font=[UIFont systemFontOfSize:12]; label.textColor=[UIColor grayColor]; [self addSubview:label]; for(int i=self.yNum;i>0;i--){ UIView *cutoffLine=[[UIView alloc] initWithFrame:CGRectMake(51, 15+(self.frame.size.height-60)/(self.yNum+1)*(self.yNum+1-i), self.frame.size.width-100, 1)]; cutoffLine.backgroundColor=[UIColor colorWithRed:245/255.0 green:245/255.0 blue:245/255.0 alpha:1.0]; [self.gradientBackgroundView addSubview:cutoffLine]; UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(0, cutoffLine.center.y-10.5, 45, 21)]; label.font=[UIFont systemFontOfSize:10]; label.textColor=[UIColor grayColor]; label.textAlignment=NSTextAlignmentRight; label.text=[NSString stringWithFormat:@"%d",self.ySpace*i]; [self addSubview:label]; } //x轴 UIView *view=[[UIView alloc] initWithFrame:CGRectMake(50, 15+self.frame.size.height-60, screen_width-100, 1)]; view.backgroundColor=[UIColor lightGrayColor]; [self addSubview:view]; for(int i=0;i<self.xNum;i++){ UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake((screen_width-100)/self.xNum*i+50, self.frame.size.height-40, (screen_width-100)/self.xNum, 21)]; label.font=[UIFont systemFontOfSize:10]; label.textColor=[UIColor grayColor]; label.text=[NSString stringWithFormat:@"%d",self.xSpace*i]; [self addSubview:label]; } label=[[UILabel alloc] initWithFrame:CGRectMake(screen_width-70, 20+self.frame.size.height-60, 70, 21)]; label.text=self.xtitle; label.font=[UIFont systemFontOfSize:12]; label.textColor=[UIColor grayColor]; [self addSubview:label];}#pragma mark 画折线图- (void)dravLine{ CGFloat barWidth=(screen_width-100)/self.xNum*(self.xNum-1)/((self.xNum-1)*self.xSpace);//条形图1个单位的宽 CGFloat barHeight=(self.frame.size.height-60)/(self.yNum+1)/self.ySpace;//条形图1个单位的高 //(xorignal,yorignal)坐标原点 CGFloat xorignal=50; CGFloat yorignal=15+self.frame.size.height-60;// UILabel * label = (UILabel*)[self viewWithTag:1000]; UIBezierPath * path = [[UIBezierPath alloc]init]; path.lineWidth = 1.0; self.path1 = path; UIColor * color = [UIColor greenColor]; [color set]; //起点 [path moveToPoint:CGPointMake( [self.data[0][@"x"] floatValue]*barWidth+xorignal, yorignal-[self.data[0][@"y"] floatValue]*barHeight )]; //数值 UILabel *label=(UILabel *)[self viewWithTag:1000]; if(label==nil){ label=[[UILabel alloc] initWithFrame:CGRectMake([self.data[0][@"x"] floatValue]*barWidth+xorignal-50, yorignal-[self.data[0][@"y"] floatValue]*barHeight-20, 100, 21)]; label.font=[UIFont systemFontOfSize:10]; label.textColor=[UIColor grayColor]; label.tag=1000; label.textAlignment=NSTextAlignmentCenter; label.text=[NSString stringWithFormat:@"%.0f",[self.data[0][@"y"] floatValue]]; [self addSubview:label]; }else{ label.frame=CGRectMake([self.data[0][@"x"] floatValue]*barWidth+xorignal-50, yorignal-[self.data[0][@"y"] floatValue]*barHeight-20, 100, 21); label.text=[NSString stringWithFormat:@"%.0f",[self.data[0][@"y"] floatValue]]; } if(!self.showNum){ label.hidden=YES; }else{ label.hidden=NO; } //圆点 UIView *roundView=(UIView *)[self viewWithTag:100]; if(roundView==nil){ roundView=[[UIView alloc] initWithFrame:CGRectMake([self.data[0][@"x"] floatValue]*barWidth+xorignal-3, yorignal-[self.data[0][@"y"] floatValue]*barHeight-3, 6, 6)]; roundView.layer.masksToBounds=YES; roundView.layer.cornerRadius=3; roundView.backgroundColor=[UIColor grayColor]; roundView.tag=100; [self addSubview:roundView]; }else{ roundView=[[UIView alloc] initWithFrame:CGRectMake([self.data[0][@"x"] floatValue]*barWidth+xorignal-3, yorignal-[self.data[0][@"y"] floatValue]*barHeight-3, 6, 6)]; } //转折点 for (NSInteger i = 1; i< self.data.count; i++) { [path addLineToPoint:CGPointMake([self.data[i][@"x"] floatValue]*barWidth+xorignal, yorignal-[self.data[i][@"y"] floatValue]*barHeight)]; UILabel *label=(UILabel *)[self viewWithTag:1000+i]; if(label==nil){ label=[[UILabel alloc] initWithFrame:CGRectMake([self.data[i][@"x"] floatValue]*barWidth+xorignal-50, yorignal-[self.data[i][@"y"] floatValue]*barHeight-20, 100, 21)]; label.font=[UIFont systemFontOfSize:10]; label.textColor=[UIColor grayColor]; label.tag=1000+i; label.textAlignment=NSTextAlignmentCenter; label.text=[NSString stringWithFormat:@"%.0f",[self.data[i][@"y"] floatValue]]; [self addSubview:label]; }else{ label.frame=CGRectMake([self.data[i][@"x"] floatValue]*barWidth+xorignal-50, yorignal-[self.data[i][@"y"] floatValue]*barHeight-20, 100, 21); label.text=[NSString stringWithFormat:@"%.0f",[self.data[i][@"y"] floatValue]]; } if(!self.showNum){//不显示转折点数值 label.hidden=YES; }else{ label.hidden=NO; } UIView *roundView=(UIView *)[self viewWithTag:100+i]; if(roundView==nil){ roundView=[[UIView alloc] initWithFrame:CGRectMake([self.data[i][@"x"] floatValue]*barWidth+xorignal-3, yorignal-[self.data[i][@"y"] floatValue]*barHeight-3, 6, 6)]; roundView.layer.masksToBounds=YES; roundView.layer.cornerRadius=3; roundView.backgroundColor=[UIColor grayColor]; roundView.tag=100+i; [self addSubview:roundView]; }else{ roundView=[[UIView alloc] initWithFrame:CGRectMake([self.data[i][@"x"] floatValue]*barWidth+xorignal-3, yorignal-[self.data[i][@"y"] floatValue]*barHeight-3, 6, 6)]; } } self.lineChartLayer = [CAShapeLayer layer]; self.lineChartLayer.path = path.CGPath; //线的颜色 self.lineChartLayer.strokeColor = [UIColor greenColor].CGColor; self.lineChartLayer.fillColor = [[UIColor clearColor] CGColor]; self.lineChartLayer.lineCap = kCALineCapRound; self.lineChartLayer.lineJoin = kCALineJoinRound; [self.gradientBackgroundView.layer addSublayer:self.lineChartLayer];//直接添加导视图上}#pragma mark 渐变的颜色- (void)drawGradientBackgroundView { // 渐变背景视图(不包含坐标轴) self.gradientBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height)]; [self addSubview:self.gradientBackgroundView]; /** 创建并设置渐变背景图层 */ //初始化CAGradientlayer对象,使它的大小为渐变背景视图的大小 self.gradientLayer = [CAGradientLayer layer]; self.gradientLayer.frame = self.gradientBackgroundView.bounds; //设置渐变区域的起始和终止位置(范围为0-1),即渐变路径 self.gradientLayer.startPoint = CGPointMake(0, 0.0); self.gradientLayer.endPoint = CGPointMake(1.0, 0.0); //设置颜色的渐变过程 self.gradientLayerColors = [NSMutableArray arrayWithArray:@[(__bridge id)[UIColor whiteColor].CGColor, (__bridge id)[UIColor whiteColor].CGColor]]; self.gradientLayer.colors = self.gradientLayerColors; //将CAGradientlayer对象添加在我们要设置背景色的视图的layer层 [self.gradientBackgroundView.layer addSublayer:self.gradientLayer];}//开始画(动画)-(void)beginDraw{ if(self.lineChartLayer!=nil){ [self.lineChartLayer removeFromSuperlayer]; } [self dravLine]; self.lineChartLayer.lineWidth = 2; CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; pathAnimation.duration = 1.0; pathAnimation.repeatCount = 1; pathAnimation.removedOnCompletion = YES; pathAnimation.fromValue = [NSNumber numberWithFloat:0.0f]; pathAnimation.toValue = [NSNumber numberWithFloat:1.0f]; // 设置动画代理,动画结束时添加一个标签,显示折线终点的信息 pathAnimation.delegate = self; [self.lineChartLayer addAnimation:pathAnimation forKey:@"strokeEnd"];}
0 0
- iOS开发(OC)——折线图的绘制(带动画)
- iOS开发(OC)——路径动画
- python实战二:使用CSV数据绘制带数据标志的折线图(matplotlib)
- iOS开发——动画编程OC篇&(一)基本动画
- iOS开发——动画编程OC篇&(二)核心动画
- iOS开发——动画编程OC篇&(三)关键帧动画
- iOS开发——动画编程OC篇&(四)转场动画
- iOS开发——动画编程OC篇&(五)动画组
- iOS 带渐变背景动画的折线统计图
- iOS 折线图动画
- 绘制带线性颜色变化填充的折线图
- 折线图的绘制
- android 绘制折线图(AChartEngine)Linechart静态的
- Android绘制line chart的过程(折线图)
- iOS开发(OC)——录音
- iOS开发(OC)——UIWindow
- 【IOS 开发学习总结-OC-66】Quartz 2D绘图(4-3)——绘制曲线+在内存中绘图+绘制位图
- iOS CADisplayLink(绘制动画)
- [深度学习论文笔记][Weight Initialization] Data-dependent Initializations of Convolutional Neural Networks
- 2.函数
- Android Studio 诉苦大会
- 最简单实用的在线pdf转换成jpg方法
- NGUI所见即所得之UIWidget , UIGeometry & UIDrawCall
- iOS开发(OC)——折线图的绘制(带动画)
- 为啥Android手机总会越用越慢?
- 有关NGUI HUD Text 的使用
- 树莓派(raspberry pi)常用镜像源
- android的常用开发包
- Sift特征
- console.log 自定义增加时间戳的完美解决方案
- 深度学习算法实践3---神经网络常用操作实现
- iOS - 关于NSURLCache