2012-03-13 4 views
5

Я пытаюсь нарисовать два круга один внутри другого, как показано ниже.рисование двух кругов с использованием Quartz CGContextFillEllipseInRect

enter image description here

мне удалось сделать один круг (внешний один) красиво, но я не уверен, как добавить 2-й круг на вершине, и как его в центр.

- (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 ? 
    // 

} 

ответ

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

Эй СЧ, спасибо за ответ, вы должны изменить в ответе выше "CGContextDrawPath (контекст, kCGPathFill);" в обоих случаях, но в других случаях это работает нормально. – chewy

+0

Да, я забыл об этом. Вы также можете использовать 'kCGPathFillStroke', если хотите как заполнить, так и погладить. – sch

5

/* Аналогично предыдущему решению, но несколько проще. радиус и параметры начального угла, определенные только для ясности. */

#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

вы можете определить '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() 
} 
Смежные вопросы