Professional Documents
Culture Documents
PieChart M
PieChart M
// PieChart.m
// dr-charts
//
// Created by DHIREN THIRANI on 4/5/16.
// Copyright © 2016 Product. All rights reserved.
//
#import "PieChart.h"
#import "Constants.h"
@end
@interface PieChart(){
CGFloat startAngle;
CGFloat radius;
CGPoint center;
CGFloat height;
CAShapeLayer *touchedLayer;
CAShapeLayer *dataShapeLayer;
}
@end
@implementation PieChart
- (instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
self.dataArray = [[NSMutableArray alloc] init];
self.legendArray = [[NSMutableArray alloc] init];
self.textFontSize = 12;
self.textFont = [UIFont systemFontOfSize:self.textFontSize];
self.textColor = [UIColor blackColor];
self.legendViewType = LegendTypeVertical;
self.showLegend = TRUE;
self.showValueOnPieSlice = TRUE;
self.showMarker = TRUE;
self.showCustomMarkerView = FALSE;
}
return self;
}
[self.dataArray addObject:data];
if (self.showLegend) {
height = HEIGHT(self) - [LegendView
getLegendHeightWithLegendArray:self.legendArray legendType:self.legendViewType
withFont:self.textFont width:WIDTH(self) - 2*SIDE_PADDING] - 2*INNER_PADDING;
}
center = self.pieView.center;
startAngle = 0;
if (self.showLegend) {
[self createLegend];
}
}
[CATransaction begin];
[CATransaction commit];
[self.pieView.layer addSublayer:shapeLayer];
}
- (UIBezierPath *)drawArcWithValue:(CGFloat)value{
CGFloat endAngle = startAngle + (value/self.totalCount.floatValue)*360;
startAngle = endAngle;
return path;
}
if(CGRectContainsPoint(self.pieView.frame, touchPoint)){
CALayer *layer = [self.pieView.layer hitTest:touchPoint];
for(CAShapeLayer *shapeLayer in layer.sublayers){
if (CGPathContainsPoint(shapeLayer.path, 0, touchPoint, YES)) {
[shapeLayer setOpacity:1.0f];
[shapeLayer setShadowRadius:10.0f];
[shapeLayer setShadowColor:[[UIColor blackColor] CGColor]];
[shapeLayer setShadowOpacity:1.0f];
touchedLayer = shapeLayer;
if ([self.delegate
respondsToSelector:@selector(didTapOnPieChartWithValue:)]) {
[self.delegate didTapOnPieChartWithValue:data];
}
break;
}
}
}
}
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
if (self.showCustomMarkerView) {
[touchedLayer setOpacity:0.7f];
[touchedLayer setShadowRadius:0.0f];
[touchedLayer setShadowColor:[[UIColor clearColor] CGColor]];
[touchedLayer setShadowOpacity:0.0f];
[self.customMarkerView removeFromSuperview];
}
else if (self.showMarker) {
[touchedLayer setOpacity:0.7f];
[touchedLayer setShadowRadius:0.0f];
[touchedLayer setShadowColor:[[UIColor clearColor] CGColor]];
[touchedLayer setShadowOpacity:0.0f];
[dataShapeLayer removeFromSuperlayer];
}
}
[self.customMarkerView removeFromSuperview];
}
else if (self.showMarker) {
[touchedLayer setOpacity:0.7f];
[touchedLayer setShadowRadius:0.0f];
[touchedLayer setShadowColor:[[UIColor clearColor] CGColor]];
[touchedLayer setShadowOpacity:0.0f];
[dataShapeLayer removeFromSuperlayer];
}
}
if (self.customMarkerView != nil) {
CGFloat viewX = 0;
if (point.x <= self.pieView.center.x) {
viewX = self.pieView.center.x;
}
else{
viewX = self.pieView.center.x - WIDTH(self.customMarkerView);
}
CGFloat viewX = 0;
if (point.x <= self.pieView.center.x) {
viewX = self.pieView.center.x;
}
else{
viewX = self.pieView.center.x - (size.width + 2*SIDE_PADDING);
}
[self.pieView.layer addSublayer:dataShapeLayer];
}
[self drawPieChart];
}
@end
@implementation PieChartDataRenderer
- (instancetype)init{
self = [super init];
if (self) {
self.value = @0;
self.title = @"";
self.color = [UIColor blackColor];
}
return self;
}
@end