
LineChartViewDemo.h
#import@interface LineChartViewDemo : UIView //橫豎軸距離間隔 @property (assign) NSInteger hInterval; @property (assign) NSInteger vInterval; //橫豎軸顯示標簽 @property (nonatomic, strong) NSArray *hDesc; @property (nonatomic, strong) NSArray *vDesc; //點信息 @property (nonatomic, strong) NSArray *array; @property (nonatomic, strong) NSArray* array1; @end
#import LineChartViewDemo.h
#import EColumnChartLabel.h
#define KlineHeight 30
@interface LineChartViewDemo()
{
CALayer *linesLayer;
UIView *popView;
UILabel *disLabel;
int x;
int y;
}
@end
@implementation LineChartViewDemo
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.backgroundColor = [UIColor clearColor];
x = frame.size.width;
y = frame.size.height;
_hInterval = 10;
_vInterval = 50;
linesLayer = [[CALayer alloc] init];
linesLayer.masksToBounds = YES;
linesLayer.contentsGravity = kCAGravityLeft;
linesLayer.backgroundColor = [[UIColor redColor] CGColor];
//[self.layer addSublayer:linesLayer];
//PopView
popView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 60, 30)];
[popView setBackgroundColor:[UIColor whiteColor]];
[popView setAlpha:0.0f];
disLabel = [[UILabel alloc]initWithFrame:popView.frame];
[disLabel setTextAlignment:NSTextAlignmentCenter];
[popView addSubview:disLabel];
[self addSubview:popView];
}
return self;
}
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
[self setClearsContextBeforeDrawing: YES];
CGContextRef context = UIGraphicsGetCurrentContext();
//畫背景線條------------------
CGColorRef backColorRef = [UIColor redColor].CGColor;
CGFloat backLineWidth = 0.5f;
CGFloat backMiterLimit = 0.f;
CGContextSetLineWidth(context, backLineWidth);//主線寬度
// CGContextSetMiterLimit(context, backMiterLimit);//投影角度
//CGContextSetShadowWithColor(context, CGSizeMake(3, 5), 8, backColorRef);//設置雙條線
CGContextSetLineJoin(context, kCGLineJoinRound);
CGContextSetLineCap(context, kCGLineCapRound );
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextSetStrokeColorWithColor(context, [UIColor grayColor].CGColor);
// CGContextSetStrokeColorWithColor(context, [UIColor colorWithRed:225.0f / 255.0f green:225.0f / 255.0f blue:225.0f / 255.0f alpha:1.0].CGColor);
// int x = 400 ;
// //Y軸橫線
// int y = 300 ;
int tempY = y;
//添加縱軸標簽和線
for (int i=0; i<_vDesc.count; i++) {
CGPoint bPoint = CGPointMake(30, tempY);
CGPoint ePoint = CGPointMake(x, tempY);
EColumnChartLabel *label = [[EColumnChartLabel alloc]initWithFrame:CGRectMake(0, 0, 30, 30)];
[label setCenter:CGPointMake(bPoint.x-15, bPoint.y-30)];
[label setTextAlignment:NSTextAlignmentCenter];
[label setBackgroundColor:[UIColor clearColor]];
[label setTextColor:[UIColor blackColor]];
[label setText:[_vDesc objectAtIndex:i]];
[self addSubview:label];
CGContextMoveToPoint(context, bPoint.x, bPoint.y-30);
CGContextAddLineToPoint(context, ePoint.x, ePoint.y-30);
tempY -= y * 0.1;
}
for (int i=0; i<_array.count-1; i++) {
EColumnChartLabel *label = [[EColumnChartLabel alloc]initWithFrame:CGRectMake(i*KlineHeight+30, y - 30, 40, 30)];
[label setTextAlignment:NSTextAlignmentCenter];
[label setBackgroundColor:[UIColor clearColor]];
[label setTextColor:[UIColor redColor]];
label.numberOfLines = 1;
label.adjustsFontSizeToFitWidth = YES;
label . minimumFontSize = 1.0f;
[label setText:[_hDesc objectAtIndex:i]];
[self addSubview:label];
}
CGContextStrokePath(context);
// //畫點線條------------------
CGColorRef pointColorRef = [UIColor colorWithRed:24.0f/255.0f green:116.0f/255.0f blue:205.0f/255.0f alpha:1.0].CGColor;
CGFloat pointLineWidth = 1.5f;
CGFloat pointMiterLimit = 5.0f;
CGContextSetLineWidth(context, pointLineWidth);//主線寬度
CGContextSetMiterLimit(context, pointMiterLimit);//投影角度
//CGContextSetShadowWithColor(context, CGSizeMake(3, 5), 8, pointColorRef);//設置雙條線
CGContextSetLineJoin(context, kCGLineJoinRound);
CGContextSetLineCap(context, kCGLineCapRound );
CGContextSetBlendMode(context, kCGBlendModeNormal);
//CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
UIColor* color1 = c_BeforeLastYear;
[color1 set];
//繪圖
CGPoint p1 = [[_array objectAtIndex:0] CGPointValue];
int i = 0;
//獲取視圖的高
int tempY1 = y;
int tempWidth = y * 0.1f;
float tempHeight = y * (270.0 / 320.0);
float tempHeight1 = y * (20.0f / 320.0f);
// NSLog(@%f);
CGContextMoveToPoint(context, p1.x + 20, tempHeight-p1.y*tempWidth/tempHeight1);
for (; i<[_array count]; i++)
{
p1 = [[_array objectAtIndex:i] CGPointValue];
CGPoint goPoint = CGPointMake(p1.x + 20, tempHeight-p1.y*tempWidth/tempHeight1);
CGContextAddLineToPoint(context, goPoint.x, goPoint.y);;
//添加觸摸點
UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
[bt setBackgroundColor:[UIColor redColor]];
[bt setFrame:CGRectMake(0, 0, 10, 10)];
[bt setCenter:goPoint];
[bt addTarget:self
action:@selector(btAction:)
forControlEvents:UIControlEventTouchUpInside];
[self addSubview:bt];
}
CGContextStrokePath(context);
// CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor);
UIColor* color = c_LastYear;
[color set];
//繪圖
p1 = [[_array1 objectAtIndex:0] CGPointValue];
i = 0;
CGContextMoveToPoint(context, p1.x + 20, tempHeight-p1.y*tempWidth/tempHeight1);
for (; i<[_array1 count]; i++)
{
p1 = [[_array1 objectAtIndex:i] CGPointValue];
CGPoint goPoint = CGPointMake(p1.x + 20, tempHeight-p1.y*tempWidth/tempHeight1);
CGContextAddLineToPoint(context, goPoint.x, goPoint.y);;
//添加觸摸點
UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
[bt setBackgroundColor:[UIColor redColor]];
[bt setFrame:CGRectMake(0, 0, 10, 10)];
[bt setCenter:goPoint];
[bt addTarget:self
action:@selector(btAction:)
forControlEvents:UIControlEventTouchUpInside];
[self addSubview:bt];
}
CGContextStrokePath(context);
}
- (void)btAction:(id)sender{
[disLabel setText:@400];
UIButton *bt = (UIButton*)sender;
popView.center = CGPointMake(bt.center.x, bt.center.y - popView.frame.size.height/2);
[popView setAlpha:1.0f];
}
#import LineChartViewDemo.h
#define CC_DEGREES_TO_RADIANS(__ANGLE__) ((__ANGLE__) * 0.01745329252f)
#define KlineHeight 20
#define KlineWidth 30
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
LineChartViewDemo* line = [[LineChartViewDemo alloc] initWithFrame:CGRectMake(0, 0, 548, 250)];
// line.layer.transform = CATransform3DMakeRotation(CC_DEGREES_TO_RADIANS(90), 0, 0, 1);
NSMutableArray *pointArr = [[NSMutableArray alloc]init];
//生成隨機點 1
//[pointArr addObject:[NSValue valueWithCGPoint:CGPointMake(KlineWidth*0, 0)]];
for (int i = 0; i < 12; i++) {
[pointArr addObject:[NSValue valueWithCGPoint:CGPointMake(KlineWidth* (i+1), 5 * i)]];
}
NSMutableArray* pointArr2 = [NSMutableArray array];
//生成隨機點 2
for (int i = 0; i < 12; i++) {
[pointArr2 addObject:[NSValue valueWithCGPoint:CGPointMake(KlineWidth* (i + 1), 10 * i)]];
}
//豎軸
NSMutableArray *vArr = [[NSMutableArray alloc]initWithCapacity:pointArr.count-1];
for (int i=0; i<9; i++) {
[vArr addObject:[NSString stringWithFormat:@%d,i*20]];
}
//橫軸
NSMutableArray *hArr = [[NSMutableArray alloc]initWithCapacity:pointArr.count-1];
for (int i = 1; i <= 12; i++) {
[hArr addObject:[NSString stringWithFormat:@%d,i]];
}
[line setHDesc:hArr];
[line setVDesc:vArr];
[line setArray:pointArr];
[line setArray1:pointArr2];
[self.view addSubview:line];
}