我是一个新手 ios 程序员。在我的一个项目中,我需要画一个圆圈,其中圆圈的不同部分将被不同的颜色填充。我可以画圆圈。但我无法确定不同的部分圆圈并用不同的颜色填充它们。这是一个屏幕截图,以阐明我想要绘制的内容。
帮助将不胜感激。
我是一个新手 ios 程序员。在我的一个项目中,我需要画一个圆圈,其中圆圈的不同部分将被不同的颜色填充。我可以画圆圈。但我无法确定不同的部分圆圈并用不同的颜色填充它们。这是一个屏幕截图,以阐明我想要绘制的内容。
帮助将不胜感激。
您可以使用UIBezierPath
which 有一种方法addArcWithCenter:radius:startAngle:endAngle:clockwise:
,您可以在其中指定半径、中心和角度。代码可能看起来像这样,它用绿色绘制了四分之一的圆圈:
CGPoint center = CGPointMake(CGRectGetWidth(self.bounds) / 2.f, CGRectGetHeight(self.bounds) / 2.f);
CGFloat radius = center.x - 10.f;
UIBezierPath *portionPath = [UIBezierPath bezierPath];
[portionPath moveToPoint:center];
[portionPath addArcWithCenter:center radius:radius startAngle:0.f endAngle:M_PI_2 clockwise:YES];
[portionPath closePath];
[[UIColor greenColor] setFill];
[portionPath fill];
UIBezierPath *portionPath1 = [UIBezierPath bezierPath];
[portionPath1 moveToPoint:center];
[portionPath1 addArcWithCenter:center radius:radius startAngle:M_PI_2 endAngle:M_PI clockwise:YES];
[portionPath1 closePath];
[[UIColor blueColor] setFill];
[portionPath1 fill];
当然你也可以考虑使用像CorePlot这样的库。
我们有 6 节课
CircleViewController.h、CircleViewController.m、GraphView.h、GraphView.h、CirclePart.h、CirclePart.m
CirclePart.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface CirclePart : NSObject
@property (nonatomic) CGFloat startDegree;
@property (nonatomic) CGFloat endDegree;
@property (nonatomic) UIColor *partColor;
-(id)initWithStartDegree:(CGFloat)startDegree endDegree:(CGFloat)endDegree partColor:(UIColor*)partColor;
@end
CirclePart.m
#import "CirclePart.h"
@implementation CirclePart
-(id)initWithStartDegree:(CGFloat)startDegree endDegree:(CGFloat)endDegree partColor:(UIColor*)partColor
{
self = [super init];
if (self) {
self.startDegree = startDegree;
self.endDegree = endDegree;
self.partColor = partColor;
}
return self;
}
@end
图形视图.h
#import <UIKit/UIKit.h>
#import "CirclePart.h"
@interface GraphView : UIView
@property (nonatomic) CGPoint centrePoint;
@property (nonatomic) CGFloat radius;
@property (nonatomic) CGFloat lineWidth;
@property (nonatomic, strong) NSArray *circleParts;
-(id)initWithFrame:(CGRect)frame CentrePoint:(CGPoint)centrePoint radius:(CGFloat)radius lineWidth:(CGFloat)lineWidth circleParts:(NSArray*)circleParts;
@end
图形视图.m
#import "GraphView.h"
@implementation GraphView
-(id)initWithFrame:(CGRect)frame CentrePoint:(CGPoint)centrePoint radius:(CGFloat)radius lineWidth:(CGFloat)lineWidth circleParts:(NSArray*)circleParts
{
self = [super initWithFrame:frame];
if (self) {
self.centrePoint = centrePoint;
self.radius = radius;
self.lineWidth = lineWidth;
self.circleParts = circleParts;
}
return self;
}
- (void)drawRect:(CGRect)rect {
[self drawCircle];
}
- (void)drawCircle {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, _lineWidth);
for(CirclePart *circlePart in _circleParts)
{
CGContextMoveToPoint(context, _centrePoint.x, _centrePoint.y);
CGContextAddArc(context, _centrePoint.x , _centrePoint.y, _radius, [self radians:circlePart.startDegree], [self radians:circlePart.endDegree], 0);
CGContextSetFillColorWithColor(context, circlePart.partColor.CGColor);
CGContextFillPath(context);
}
}
-(float) radians:(double) degrees {
return degrees * M_PI / 180;
}
@end
CircleViewController.h
#import <UIKit/UIKit.h>
@interface CircleViewController : UIViewController
@end
CircleViewController.m
#import "CircleViewController.h"
#import "GraphView.h"
#import "CirclePart.h"
@interface CircleViewController ()
@end
@implementation CircleViewController
- (void)viewDidLoad {
[super viewDidLoad];
CirclePart *part1 = [[CirclePart alloc] initWithStartDegree:0 endDegree:120 partColor:[UIColor redColor]];
CirclePart *part2 = [[CirclePart alloc] initWithStartDegree:120 endDegree:250 partColor:[UIColor blueColor]];
CirclePart *part3 = [[CirclePart alloc] initWithStartDegree:250 endDegree:360 partColor:[UIColor grayColor]];
NSArray *circleParts = [[NSArray alloc] initWithObjects:part1, part2, part3, nil];
CGRect rect = CGRectMake(100, 100, 200, 200);
CGPoint circleCenter = CGPointMake(rect.size.width / 2, rect.size.height / 2);
GraphView *graphView = [[GraphView alloc] initWithFrame:rect CentrePoint:circleCenter radius:80 lineWidth:2 circleParts:circleParts];
graphView.backgroundColor = [UIColor whiteColor];
graphView.layer.borderColor = [UIColor redColor].CGColor;
graphView.layer.borderWidth = 1.0f;
[self.view addSubview:graphView];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
这是一个简单的三角学问题。找出饼部分所需的角度(饼片百分比时间 360 度),然后移动到中心。以适当的角度线到圆边缘,以所需的弧角向饼图的下一侧弧线,然后线回到中心。
或者,您可以使用CorePlot为您制作饼图。