Рисование полого круга в iPhone - PullRequest
12 голосов
/ 02 мая 2011

Мне нужно нарисовать следующее изображение enter image description here

Серая часть - это то, что я хочу нарисовать поверх другого изображения. Какой код мне нужно использовать с помощью методов CGContext, я пытался использовать CGContextAddArc, но не смогпотому что, когда я заполняю обводку, центральная полость также заполняется серой текстурой.

Любая помощь приветствуется.

Информация: у меня есть полное синее изображение, мне нужно добавить полукруг вышесинее изображение

спасибо

Ответы [ 3 ]

25 голосов
/ 02 мая 2011

Посмотрите на Заполнение пути в документации Core Graphics. По сути, вы добавляете к своему пути две дуги (внешнюю и внутреннюю), а затем используете правила заливки Core Graphics в своих интересах. Код будет выглядеть примерно так:

CGMutablePathRef path = CGPathCreateMutable();

// Add the outer arc to the path (as if you wanted to fill the entire circle)
CGPathMoveToPoint(path, ...);
CGPathAddArc(path, ...);
CGPathCloseSubpath(path);

// Add the inner arc to the path (later used to substract the inner area)
CGPathMoveToPoint(path, ...);
CGPathAddArc(path, ...);
CGPathCloseSubpath(path);

// Add the path to the context
CGContextAddPath(context, path);

// Fill the path using the even-odd fill rule
CGContextEOFillPath(context);

CGPathRelease(path);
10 голосов
/ 06 мая 2011

Продолжая работать над тем, что Оле Бегеманн сослался на его ответ и некоторые изменения, я смог выполнить требование.

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(context, [UIColor colorWithPatternImage:[UIImage imageNamed:@"background_grey_pattern.png"]].CGColor);
CGMutablePathRef path = CGPathCreateMutable();
CGContextSetLineWidth(context, 40);
CGPathAddArc(path, NULL, aRect.size.width/2, aRect.size.height/2, 45, 0*3.142/180, angle*3.142/180, 0);
CGContextAddPath(context, path);
CGContextStrokePath(context);
CGPathRelease(path);

Поэтому вместо 2 дуг я использовал только одну ипогладил его с большей шириной.

4 голосов
/ 14 октября 2015

Это тангенциально, но отчасти актуально. Вот мой код рисования Swift для пончика (или пустого круга).

class func drawDonut(donutColor: UIColor, rect: CGRect, innerDonutProportion: CGFloat) {

    //// Variable Declarations
    let innerDonutSide: CGFloat = rect.size.width * innerDonutProportion
    let innerDonutOffset: CGFloat = 0.5 * (rect.size.width - innerDonutSide)
    let innerDonutRect = CGRectMake(innerDonutOffset, innerDonutOffset, innerDonutSide, innerDonutSide)

    //// InnerCircle Drawing
    let innerCirclePath = UIBezierPath(ovalInRect: innerDonutRect)

    //// Outer Circle Drawing
    let outerCirclePath = UIBezierPath(ovalInRect: rect)

    // Clip out the innerCirclePath
    outerCirclePath.appendPath(innerCirclePath)
    outerCirclePath.addClip()
    outerCirclePath.usesEvenOddFillRule = true;

    // and Fill the outerCircle
    donutColor.setFill()
    outerCirclePath.fill()
}
...