2014-04-22 60 views
0

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

UIBezierPath.bounds 

但显然,这并不工作:(因此,我的下一个想法是要经过在UIBezierPath每一个点,并获得了“最低”的点,最“左”点之后。借鉴基于这些点圆

我的问题是:?是否有周围绘制一个自定义UIBezierPath圆的更优雅和有效的方式

+2

展你的代码使用'bounds'并描述它做错了什么。 – Wain

+0

哦,这很简单,当边界宽度= 10和高度= 1时,圆是平的,但不是圆的。这发生在不同的形状上。 – user1990524

+0

所以问题就在于你需要总是从界限中取出一个圆圈? – Wain

回答

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; 
} 
}