Нарисуйте часть круга

Для приложения iPhone я хочу нарисовать круг, который предназначен только для заполнения x процентов.

Что-то вроде этого:

alt text

У меня нет проблем с вычислением радиуса, степеней или радианов, это не проблема. Также рисование круга уже сделано. Но как я могу получить SDK iPhone, чтобы нарисовать заполненную часть.

Я могу нарисовать прямоугольник такого размера, но не часть круга.

Я просто хочу сделать это в обычном контексте.

Надеюсь, кто-то может дать мне какие-нибудь указания.

Используйте CGContext дуги CGContext :

 CGContextAddArc(context, centerX, centerY, radius, startAngleRadians, endAngleRadians, clockwise ? 1 : 0); 

См. Документацию для CGContextAddArc() .

Многие люди показали вам, как это можно сделать в Core Graphics, но это также можно сделать с помощью Core Animation, что дает большое дополнение к легкости для анимации процента формы пирога.

Следующий код создаст как кольцо, так и частично заполненные слои (даже если вы сказали, что вы уже можете нарисовать кольцо), так как приятно использовать как кольцо, так и форму пирога, используя тот же метод.

Если вы анимируете свойства strokeStart или strokeEnd слоя pieShape, у вас будет процентное ожидание. Как и в случае с кодом Core Animation, вам нужно добавить QuartzCore.framework в свой проект и включить в свой код.

 // Create a white ring that fills the entire frame and is 2 points wide. // Its frame is inset 1 point to fit for the 2 point stroke width CGFloat radius = MIN(self.frame.size.width,self.frame.size.height)/2; CGFloat inset = 1; CAShapeLayer *ring = [CAShapeLayer layer]; ring.path = [UIBezierPath bezierPathWithRoundedRect:CGRectInset(self.bounds, inset, inset) cornerRadius:radius-inset].CGPath; ring.fillColor = [UIColor clearColor].CGColor; ring.strokeColor = [UIColor whiteColor].CGColor; ring.lineWidth = 2; // Create a white pie-chart-like shape inside the white ring (above). // The outside of the shape should be inside the ring, therefore the // frame needs to be inset radius/2 (for its outside to be on // the outside of the ring) + 2 (to be 2 points in). CAShapeLayer *pieShape = [CAShapeLayer layer]; inset = radius/2 + 2; // The inset is updated here pieShape.path = [UIBezierPath bezierPathWithRoundedRect:CGRectInset(self.bounds, inset, inset) cornerRadius:radius-inset].CGPath; pieShape.fillColor = [UIColor clearColor].CGColor; pieShape.strokeColor = [UIColor whiteColor].CGColor; pieShape.lineWidth = (radius-inset)*2; // Add sublayers // NOTE: the following code is used in a UIView subclass (thus self is a view) // If you instead chose to use this code in a view controller you should instead // use self.view.layer to access the view of your view controller. [self.layer addSublayer:ring]; [self.layer addSublayer:pieShape]; 

Попробуй это:

 CGContextMoveToPoint(the center point) CGContextAddLineToPoint(the starting point of the fill path on the circumference) CGContextAddArcToPoint(the ending point of the fill path on the circumference) CGContextAddLineToPoint(the center point) CGContextFillPath 

Я реализовал представление о движении пирога, которое похоже на то, что вы делаете. Это с открытым исходным кодом. Надеюсь, исходный код поможет.

Источник SSPieProgressView.h

Источник SSPieProgressView.m

CircleViewController.h

 #import  @interface CircleViewController : UIViewController @end 

CircleViewController.m

 #import "CircleViewController.h" #import "GraphView.h" @interface CircleViewController () @end @implementation CircleViewController - (void)viewDidLoad { [super viewDidLoad]; GraphView *graphView = [[GraphView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)]; 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 

GraphView.h

 #import  @interface GraphView : UIView @end 

GraphView.m

 #import "GraphView.h" @implementation GraphView - (void)drawRect:(CGRect)rect { CGPoint circleCenter = CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2); [self drawCircleWithCircleCenter:(CGPoint) circleCenter radius:80 firstColor:[UIColor blueColor].CGColor secondeColor:[UIColor redColor].CGColor lineWidth:2 startDegree:0 currentDegree:90]; //[self drawCircleWithCircleCenter2:(CGPoint) circleCenter radius:80 firstColor:[UIColor blueColor].CGColor secondeColor:[UIColor redColor].CGColor lineWidth:2 startDegree:0 currentDegree:90]; } - (void)drawCircleWithCircleCenter:(CGPoint) circleCenter radius:(CGFloat)radius firstColor:(CGColorRef)firstColor secondeColor:(CGColorRef)secondeColor lineWidth:(CGFloat)lineWidth startDegree:(float)startDegree currentDegree:(float)endDegree { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetLineWidth(context, lineWidth); CGContextMoveToPoint(context, circleCenter.x, circleCenter.y); CGContextAddArc(context, circleCenter.x , circleCenter.y, radius, [self radians:startDegree], [self radians:endDegree], 0); CGContextSetFillColorWithColor(context, firstColor); CGContextFillPath(context); CGContextMoveToPoint(context, circleCenter.x, circleCenter.y); CGContextAddArc(context, circleCenter.x, circleCenter.y, radius, [self radians:endDegree], [self radians:startDegree], 0); CGContextSetFillColorWithColor(context, secondeColor); CGContextFillPath(context); } - (void)drawCircleWithCircleCenter2:(CGPoint) circleCenter radius:(CGFloat)radius firstColor:(CGColorRef)firstColor secondeColor:(CGColorRef)secondeColor lineWidth:(CGFloat)lineWidth startDegree:(float)startDegree currentDegree:(float)endDegree { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetLineWidth(context, lineWidth); CGContextMoveToPoint(context, circleCenter.x, circleCenter.y); CGContextAddArc(context, circleCenter.x , circleCenter.y, radius, [self radians:startDegree], [self radians:endDegree], 0); CGContextSetFillColorWithColor(context, firstColor); CGContextFillPath(context); CGContextMoveToPoint(context, circleCenter.x, circleCenter.y); CGContextAddArc(context, circleCenter.x, circleCenter.y, radius, [self radians:endDegree], [self radians:startDegree], 0); CGContextSetStrokeColorWithColor(context, secondeColor); CGContextStrokePath(context); } -(float) radians:(double) degrees { return degrees * M_PI / 180; } @end 

Примечание: вы можете использовать один из двух методов: «drawCircleWithCircleCenter» или «drawCircleWithCircleCenter2»

этот код, если вы хотите разделить ячейку только на 2 части

если вы хотите разделить ячейку на более чем 2 частях, вы можете проверить это: « Рисование круга, заполнение разных частей разным цветом » и проверка начала ответа на эту фразу «у нас есть 6 class»,

Ну, так как до сих пор никто не использовал NSBezierPath, я решил, что могу предложить решение, которое я недавно использовал для той же проблемы:

 -(void)drawRect:(NSRect)dirtyRect { double start = -10.0; //degrees double end = 190.0; //degrees NSPoint center = NSMakePoint(350, 200); double radius = 50; NSBezierPath *sector = [NSBezierPath bezierPath]; [sector moveToPoint:center]; [sector appendBezierPathWithArcWithCenter:center radius:radius startAngle:start endAngle:end]; [sector lineToPoint:center]; [sector fill]; } 

Ниже приведен полный метод, который я использую, что делает это с помощью Core Graphics, адаптируясь и расширяя комментарий mharper выше.

Этот код предназначен для OSX Cocoa, но его можно легко изменить на iOS, изменив способ получения контекста.

 - (void)drawPieShapedCircleWithRadius:(CGFloat)radius strokeColor:(CGColorRef)strokeColor fillColor:(CGColorRef)fillColor lineWidth:(CGFloat)lineWidth currentDegrees:(float)currentDegrees startDegrees:(float)startDegrees { // get the context CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort]; // Set the color of the circle stroke and fill CGContextSetStrokeColorWithColor(context, strokeColor); CGContextSetFillColorWithColor(context, fillColor); // Set the line width of the circle CGContextSetLineWidth(context, 1); // Calculate the middle of the circle CGPoint circleCenter = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2); // Move the bezier to the center of the circle CGContextMoveToPoint(context, circleCenter.x, circleCenter.y); // move to the center point // Draw the arc from the start point (hardcoded as the bottom of the circle) to the center CGContextAddLineToPoint(context, circleCenter.x, circleCenter.y + radius); // Draw the arc around the circle from the start degrees point to the current degrees point CGContextAddArc(context, circleCenter.x , circleCenter.y, radius, [self radians:startDegrees], [self radians:startDegrees + currentDegrees], 0); // Draw the line back into the center of the circle CGContextAddLineToPoint(context, circleCenter.x, circleCenter.y); // Fill the circle CGContextFillPath(context); // Draw the line around the circle CGContextStrokePath(context); } 

Попробуйте этот код в UIView, например, «MyChartClass» …

 - (void)drawRect:(CGRect)rect { int c=(int)[itemArray count]; CGFloat angleArray[c]; CGFloat offset; int sum=0; CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetAllowsAntialiasing(context, false); CGContextSetShouldAntialias(context, false); for(int i=0;i<[itemArray count];i++) { sum+=[[itemArray objectAtIndex:i] intValue]; } for(int i=0;i<[itemArray count];i++) { angleArray[i]=(float)(([[itemArray objectAtIndex:i] intValue])/(float)sum)*(2*3.14); CGContextMoveToPoint(context, radius, radius); if(i==0) CGContextAddArc(context, radius, radius, radius, 0,angleArray[i], 0); else CGContextAddArc(context, radius, radius, radius,offset,offset+angleArray[i], 0); offset+=angleArray[i]; CGContextSetFillColorWithColor(context, ((UIColor *)[myColorArray objectAtIndex:i]).CGColor); CGContextClosePath(context); CGContextFillPath(context); } } 

Выполнение в вашем UIViewController

 MyChartClass *myChartClass=[[MyChartClass alloc]initWithFrame:CGRectMake(0, 0, 200, 200)]; myChartClass.backgroundColor = [UIColor clearColor]; myChartClass.itemArray=[[NSArray alloc]initWithObjects:@"75",@"25", nil]; myChartClass.myColorArray=[[NSArray alloc]initWithObjects:[UIColor blackColor],[UIColor whiteColor], nil]; myChartClass.radius=100; [self.view addSubview:myChartClass]; 

С уважением.

  • objective C: Как вы можете повернуть текст для UIButton и UILabel?
  • Что именно делает делегат в проекте xcode ios?
  • Почему NSUserDefaults не удалось сохранить NSMutableDictionary в iPhone SDK?
  • Как создать изображение из UILabel?
  • Как использовать метод prepareForReuse
  • iPhone SDK: в чем разница между loadView и viewDidLoad?
  • Можно ли показать изображение в UIAlertView?
  • Использование iPhone - dequeueReusableCellWithIdentifier
  • UIPopoverController для iphone не работает?
  • Добавить UIView над всеми другими видами, включая StatusBar
  • Как я могу отложить вызов метода на 1 секунду?
  • Interesting Posts

    Почему IP-адрес указан как 172.18.0.150/24?

    Xcode: удалить горячую клавишу

    Как использовать reflection для вызова частного метода?

    Общий список – перемещение элемента в списке

    Является ли наиболее значительная десятичная цифра точностью, которая может быть преобразована в двоичную и обратно в десятичную без потери значимости 6 или 7.225?

    Как удалить папку с файлами с помощью Java

    Какова ценность контрольных сумм MD5, если потенциально также можно было манипулировать самим хеш-файлом MD5?

    Папки, переименованные в Проводник Windows, сохраняют исходное имя

    Могу ли я запускать приложения iOS на своем Mac?

    Когда для генерации Java требуется вместо и есть ли недостаток переключения?

    Как найти самый высокий z-индекс с помощью jQuery

    Как изменить название пакета Android Project в Eclipse?

    Какова функция клавиши Alt Gr?

    Как заменить новую строку (\ n) с помощью sed?

    INSTALL_FAILED_UPDATE_INCOMPATIBLE, когда я пытаюсь установить скомпилированный .apk на устройство

    Давайте будем гением компьютера.