在自定义UIBezierPath周围绘制圆圈

时间:2014-04-22 09:34:59

标签: ios objective-c uibezierpath

我有一个用户在触摸屏上绘制的UIBezierPath。现在我想围绕此路径/绘图绘制一个圆,并且路径必须位于此圆的中间。我试着用:

UIBezierPath.bounds

但显然这不起作用:(所以我的下一个想法是通过UIBezierPath中的每个点并获得“最低”点和最“左”点。然后根据这些点绘制圆圈。< / p>

我的问题是:是否有更优雅有效的方法围绕自定义UIBezierPath绘制圆圈?

1 个答案:

答案 0 :(得分:0)

这样做了:

NSMutableArray *bezierPoints = [NSMutableArray array];
CGPathApply(drawPath.CGPath, (__bridge void *)(bezierPoints), MyCGPathApplierFunc);

float minX = 100000.f;
float minY = 100000.f;

for(NSValue* value in bezierPoints)
{
    CGPoint point = value.CGPointValue;

    if (point.x<minX)
        minX = point.x;
    if (point.y<minY)
        minY = point.y;
}
float midX = minX + (drawPath.bounds.size.width/2);
float midY = minY + (drawPath.bounds.size.height/2);

float radius = 0.f;
if (drawPath.bounds.size.width>drawPath.bounds.size.height)
{
    radius = drawPath.bounds.size.width * 0.65;

}
else
{
    radius = drawPath.bounds.size.height * 0.65;
}

CGMutablePathRef myPath = CGPathCreateMutable();
CGPathAddArc(myPath, NULL, midX,midY,radius , 0, M_PI*2, YES);



SKShapeNode* node = [[SKShapeNode alloc]init];
node.path = myPath;
node.fillColor = nil;
node.strokeColor = SKColor.redColor;
[self addChild:node];

void MyCGPathApplierFunc (void *info, const CGPathElement *element) {
NSMutableArray *bezierPoints = (__bridge NSMutableArray *)info;

CGPoint *points = element->points;
CGPathElementType type = element->type;

switch(type) {
    case kCGPathElementMoveToPoint: // contains 1 point
        [bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]];
        break;

    case kCGPathElementAddLineToPoint: // contains 1 point
        [bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]];
        break;

    case kCGPathElementAddQuadCurveToPoint: // contains 2 points
        [bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]];
        [bezierPoints addObject:[NSValue valueWithCGPoint:points[1]]];
        break;

    case kCGPathElementAddCurveToPoint: // contains 3 points
        [bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]];
        [bezierPoints addObject:[NSValue valueWithCGPoint:points[1]]];
        [bezierPoints addObject:[NSValue valueWithCGPoint:points[2]]];
        break;

    case kCGPathElementCloseSubpath: // contains no point
        break;
}
 }