我有一个用户在触摸屏上绘制的UIBezierPath。现在我想围绕此路径/绘图绘制一个圆,并且路径必须位于此圆的中间。我试着用:
UIBezierPath.bounds
但显然这不起作用:(所以我的下一个想法是通过UIBezierPath中的每个点并获得“最低”点和最“左”点。然后根据这些点绘制圆圈。< / p>
我的问题是:是否有更优雅有效的方法围绕自定义UIBezierPath绘制圆圈?
答案 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;
}
}