是否有可能从uview中获得所有uibezerpath?

我一直在研究,没有find答案。

如果我使用CGGontext绘制到视图,是否有可能从UIView一次绘制UIView所有的UIBezierPath? (如果是的话,你可以给我一个想法如何?)UIBezierPath来自用户input,所以如果用户绘制了很多UIBezierPath,我需要所有这些path,并将其保存到.svg文件。

下面是一个更好的工作示例,在testing了我在我的评论中给出的一些答案之后,这将返回一个shapelayers或图层的数组,这取决于您要查找的内容:

CAShapeLayer * firstNameCorners = [CAShapeLayer layer]; [firstNameCorners setPath:[UIBezierPath bezierPathWithRoundedRect:CGRectMake(100, 100, 196.75, 44.0) byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerTopLeft cornerRadii:(CGSize){2.5, 2.5}].CGPath]; [[self.view layer] addSublayer:firstNameCorners]; NSMutableArray *this = [[NSMutableArray alloc] init]; for (CALayer * rd in self.view.layer.sublayers) { if ([rd isKindOfClass:[CAShapeLayer class]]) { [this addObject:rd]; NSLog(@"this is a layer: %@", rd); } } NSLog(@"this is an Array of Shapes: %@", this); 

CAShapeLayer也可以存储一行代码,不pipe这个代码行有多复杂,如果它来自UIBezierPath,这个对象可以存储它,并且将它存储在你正在绘制的UIView的subLayer中。 事实上,为了进一步扩展,为了您的目的,请参阅以下内容,这将返回CGPath,根据您的问题,这是您想要的:

 CAShapeLayer * firstNameCorners = [CAShapeLayer layer]; [firstNameCorners setPath:[UIBezierPath bezierPathWithRoundedRect:CGRectMake(100, 100, 96.75, 44.0) byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerTopLeft cornerRadii:(CGSize){2.5, 2.5}].CGPath]; [[self.view layer] addSublayer:firstNameCorners]; NSMutableArray *this = [[NSMutableArray alloc] init]; for (CALayer * rd in self.view.layer.sublayers) { if ([rd isKindOfClass:[CAShapeLayer class]]) { [this addObject:rd]; CAShapeLayer * rf = (CAShapeLayer*)rd; NSLog(@"this is a layer: %@", rf.path); CGRect pathBounds = CGPathGetBoundingBox(rf.path); NSLog(@"this is this boundingBox: origin.X: %f, origin.X: %f, size.Width: %f, size.Height: %f", pathBounds.origin.x, pathBounds.origin.y, pathBounds.size.width, pathBounds.size.height); } } NSLog(@"this is an Array of Shapes: %@", this); 

而且,如果你想更进一步,那么这工作存储CGRect坐标,而且,这将告诉你如何检索和使用这些坐标:

 CAShapeLayer * firstNameCorners = [CAShapeLayer layer]; [firstNameCorners setPath:[UIBezierPath bezierPathWithRoundedRect:CGRectMake(100, 100, 196.75, 44.0) byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerTopLeft cornerRadii:(CGSize){2.5, 2.5}].CGPath]; [[self.view layer] addSublayer:firstNameCorners]; NSMutableArray *this = [[NSMutableArray alloc] init]; NSMutableArray *that = [[NSMutableArray alloc] init]; for (CALayer * rd in self.view.layer.sublayers) { if ([rd isKindOfClass:[CAShapeLayer class]]) { [this addObject:rd]; CAShapeLayer * rf = (CAShapeLayer*)rd; NSLog(@"this is a layer: %@", rf.path); CGRect pathBounds = CGPathGetBoundingBox(rf.path); [that addObject:[NSValue valueWithCGRect:pathBounds]]; NSLog(@"this is this boundingBox: origin.X: %f, origin.X: %f, size.Width: %f, size.Height: %f", pathBounds.origin.x, pathBounds.origin.y, pathBounds.size.width, pathBounds.size.height); } } 

现在,结束,这是一个从https://github.com/erica/iOS-6-Cookbook的改编,这是为了显示我的绘制UIBezierPath的完整解开开始:

 #define VALUE(_INDEX_) [NSValue valueWithCGPoint:points[_INDEX_]] -(void)showPaths { CAShapeLayer * firstNameCorners = [CAShapeLayer layer]; [firstNameCorners setPath:[UIBezierPath bezierPathWithRoundedRect:CGRectMake(100, 100, 196.75, 44.0) byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerTopLeft cornerRadii:(CGSize){2.5, 2.5}].CGPath]; [[self.view layer] addSublayer:firstNameCorners]; NSMutableArray *this = [[NSMutableArray alloc] init]; NSMutableArray *that = [[NSMutableArray alloc] init]; for (CALayer * rd in self.view.layer.sublayers) { if ([rd isKindOfClass:[CAShapeLayer class]]) { [this addObject:rd]; CAShapeLayer * rf = (CAShapeLayer*)rd; NSLog(@"this is a layer: %@", rf.path); CGRect pathBounds = CGPathGetBoundingBox(rf.path); [that addObject:[NSValue valueWithCGRect:pathBounds]]; CGMutablePathRef p3 = CGPathCreateMutableCopy(rf.path); NSArray *p3points = [self pointsFromCGPath:p3]; for (NSValue *point in p3points) { NSLog(@"path element in p3: %@", NSStringFromCGPoint(point.CGPointValue)); } NSLog(@"this is this boundingBox: origin.X: %f, origin.X: %f, size.Width: %f, size.Height: %f", pathBounds.origin.x, pathBounds.origin.y, pathBounds.size.width, pathBounds.size.height); } } } void getPointsFromBezier(void *info, const CGPathElement *element) { NSMutableArray *bezierPoints = (__bridge NSMutableArray *)info; // Retrieve the path element type and its points CGPathElementType type = element->type; CGPoint *points = element->points; switch (type) { case kCGPathElementMoveToPoint: NSLog(@"MoveToPoint (%3.2f, %3.2f", points->x, points->y); break; case kCGPathElementAddLineToPoint: NSLog(@"AddLineToPoint (%3.2f, %3.2f)", points->x, points->y); break; case kCGPathElementAddQuadCurveToPoint: NSLog(@"AddQuadCurveToPoint (%3.2f, %3.2f), (%3.2f, %3.2f)", points->x, points->y, points[1].x, points[1].y); break; case kCGPathElementAddCurveToPoint: NSLog(@"AddCurveToPoint (%3.2f, %3.2f), (%3.2f, %3.2f), (%3.2f, %3.2f)", points->x, points->y, points[1].x, points[1].y, points[2].x, points[2].y); break; case kCGPathElementCloseSubpath: NSLog(@"CloseSubpath (%3.2f, %3.2f)", points->x, points->y); break; default: NSLog(@"unknown"); break; } // Add the points if they're available (per type) if (type != kCGPathElementCloseSubpath) { [bezierPoints addObject:VALUE(0)]; if ((type != kCGPathElementAddLineToPoint) && (type != kCGPathElementMoveToPoint)) [bezierPoints addObject:VALUE(1)]; } if (type == kCGPathElementAddCurveToPoint) [bezierPoints addObject:VALUE(2)]; } - (NSArray *)pointsFromCGPath:(CGPathRef)path { NSMutableArray *points = [NSMutableArray array]; CGPathApply(path, (__bridge void *)points, getPointsFromBezier); return points; } 

输出将logging到控制台,存储在我们开始的CAShapeLayer中的所有path,输出太大而且难以发布在这里,但是这里是开始的样子:

[30146:2680987] MoveToPoint(103.82,100.00

[30146:2680987] AddLineToPoint(296.75,100.00)

[30146:2680987] AddLineToPoint(296.75,144.00)

[30146:2680987] AddLineToPoint(103.82,144.00)

AddCurveToPoint(102.72,144.00),(102.17,144.00),(101.67,143.84)

[30146:2680987] AddLineToPoint(101.58,143.81)

[30146:2680987] AddCurveToPoint(100.93,143.58),(100.42,143.07),(100.19,142.42)

AddCurveToPoint(100.00,141.83),(100.00,141.28),(100.00,140.18)

[30146:2680987] AddLineToPoint(100.00,103.82)

AddCurveToPoint(100.00,102.72),(100.00,102.17),(100.16,101.67)

[30146:2680987] AddLineToPoint(100.19,101.58)

[30146:2680987] AddCurveToPoint(100.42,100.93),(100.93,100.42),(101.58,100.19)

AddCurveToPoint(102.17,100.00),(102.72,100.00),(103.82,100.00)

[30146:2680987] AddLineToPoint(103.82,100.00)

[30146:2680987] p3中的path元素:{103.8216625,100}

[30146:2680987] p3中的path元素:{296.75,100}

p3中的[30146:2680987]path元素:{296.75,144}

在p3中的[30146:2680987]path元素:{103.8216625,144}

[30146:2680987] p3中的path元素:{102.72123239404632,144}

p3中的[30146:2680987]path元素:{102.17101736015751,144}

如果您使用Core Graphics绘制path,则可能有一些模型支持drawRect在绘制所有path时使用的视图。 如果你不这样做(即你只是更新一个位图),你应该简单地重构那个代码来捕获和保存表示path所需的信息。