2012-03-13 9 views
5

Estoy tratando de dibujar dos círculos uno dentro del otro como la imagen de abajo.dibujando dos círculos usando Quartz CGContextFillEllipseInRect

enter image description here

he logrado dibujar un círculo (la externa) muy bien, pero no estoy seguro de cómo agregar el segundo círculo en la parte superior, y la forma de centrarla.

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(context, 4.0); 
    CGContextSetStrokeColorWithColor(context, 
            [UIColor whiteColor].CGColor); 
    // 
    UIColor *theFillColor = UIColorFromRGB(0x6c83a6); 
    CGContextSetFillColor(context, CGColorGetComponents(theFillColor.CGColor)); 

    CGRect rectangle = CGRectMake(5.0,5.0,rect.size.width-10.0,rect.size.height-10.0); 


    CGContextAddEllipseInRect(context, rectangle); 
    CGContextStrokePath(context); 
    CGContextFillEllipseInRect(context, rectangle); 
    UIGraphicsEndImageContext(); 
    // 
    // INSIDE ? 
    // 

} 

Respuesta

14
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetLineWidth(context, 4.0); 
CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); 
UIColor *theFillColor = UIColorFromRGB(0x6c83a6); 
CGContextSetFillColorWithColor(context, theFillColor.CGColor); 

CGRect rectangle = CGRectMake(5.0,5.0,rect.size.width-10.0,rect.size.height-10.0); 
CGContextBeginPath(context); 
CGContextAddEllipseInRect(context, rectangle); 
CGContextDrawPath(context, kCGPathFillStroke); // Or kCGPathFill 

CGRect smallRect = CGRectInset(rectangle, 40, 40); // change 40 with the desired value 
// You may change the fill and stroke here before drawing the circle 
CGContextBeginPath(context); 
CGContextAddEllipseInRect(context, smallRect); 
CGContextDrawPath(context, kCGPathFillStroke); // Or kCGPathFill 

UIGraphicsEndImageContext(); 
+0

Hey SCH, gracias por la respuesta, debe cambiar en la respuesta anterior "CGContextDrawPath (contexto, kCGPathFill);" en ambos casos, pero aparte de eso, funciona bien. – chewy

+0

Sí, me olvidé de eso. También puede usar 'kCGPathFillStroke' si desea llenar y acariciar. – sch

5

/* similares a la solución anterior, pero algo más sencilla. radio y variables de ángulo de inicio definidas solo por claridad. */

#define PI 3.14285714285714 
float radius1 = 80; 
float radius2 = 30; 
float startAngle = 0; 
float endAngle = endAngle = PI*2; 
CGPoint position = CGPointMake(100,100); 

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetLineWidth(context, 4.0); 
CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); 
UIColor *theFillColor = UIColorFromRGB(0x6c83a6); 
CGContextSetFillColorWithColor(context, theFillColor.CGColor); 

CGContextBeginPath(context); 
CGContextAddArc(ctx, position.x, position.y, radius1, startAngle, endAngle, 1); 
CGContextDrawPath(context, kCGPathFillStroke); // Or kCGPathFill 

// You may change the fill and stroke here before drawing the circle 
CGContextBeginPath(context); 
CGContextAddArc(ctx, position.x, position.y, radius2, startAngle, endAngle, 1); 
CGContextDrawPath(context, kCGPathFillStroke); // Or kCGPathFill 

UIGraphicsEndImageContext(); 
+1

puede definir el 'M_PI' – graver

0

Swift

func drawRect(rect: CGRect) { 
let context: CGContextRef = UIGraphicsGetCurrentContext()! 
CGContextSetLineWidth(context, 4.0) 
CGContextSetStrokeColorWithColor(context, UIColor(hue: 0, saturation: 0, brightness: 94, alpha: 242).CGColor) 

let theFillColor: UIColor = UIColor(hue: 0, saturation: 100, brightness: 80, alpha: 204) 
CGContextSetFillColorWithColor(context, theFillColor.CGColor) 

let rectangle: CGRect = CGRectMake(5.0, 5.0, rect.size.width-10.0, rect.size.height-10.0) 
CGContextBeginPath(context) 
CGContextAddEllipseInRect(context, rectangle) 
CGContextDrawPath(context, CGPathDrawingMode.FillStroke) 

let smallRect: CGRect = CGRectInset(rectangle, 40, 40) 

CGContextBeginPath(context) 
CGContextAddEllipseInRect(context, smallRect) 
CGContextDrawPath(context, CGPathDrawingMode.FillStroke) 
UIGraphicsEndImageContext() 
} 
Cuestiones relacionadas