Iphone 填充路径
我正在尝试动态创建拼图块,它如下所示:Iphone 填充路径,iphone,ios,ipad,quartz-2d,Iphone,Ios,Ipad,Quartz 2d,我正在尝试动态创建拼图块,它如下所示: 我想用一些颜色填充此形状,使其看起来像这样: 所以我可以用它来掩盖一些图像。 问题: 我使用4个UIBezierPath创建此形状,然后使用appendPath将其转换为1个路径 我想填充此路径,但当我使用fill时,我得到了以下结果: 你知道我如何填充相同的形状吗?尝试以下方法:用所有组合点创建一个UIbenzierPath 在.m文件中添加以下方法 void MyCGPathApplierFunc (void *info, const CGPa
我想用一些颜色填充此形状,使其看起来像这样:
所以我可以用它来掩盖一些图像。
问题: 我使用4个UIBezierPath创建此形状,然后使用
appendPath
将其转换为1个路径我想填充此路径,但当我使用
fill
时,我得到了以下结果:
你知道我如何填充相同的形状吗?尝试以下方法:用所有组合点创建一个UIbenzierPath 在.m文件中添加以下方法
void MyCGPathApplierFunc (void *info, const CGPathElement *element) {
UIBezierPath *drawingPath = (UIBezierPath *)info;
CGPoint *points = element->points;
CGPathElementType type = element->type;
switch(type) {
case kCGPathElementMoveToPoint: // contains 1 point
[drawingPath moveToPoint:[[NSValue valueWithCGPoint:points[0]] CGPointValue]];
break;
case kCGPathElementAddLineToPoint: // contains 1 point
[drawingPath addLineToPoint:[[NSValue valueWithCGPoint:points[0]] CGPointValue]];
break;
case kCGPathElementAddQuadCurveToPoint: // contains 1 point
[drawingPath addQuadCurveToPoint:[[NSValue valueWithCGPoint:points[0]] CGPointValue]];
break;
case kCGPathElementAddCurveToPoint: // contains 1 point
[drawingPath addCurveToPoint:[[NSValue valueWithCGPoint:points[0]] CGPointValue]];
break;
case kCGPathElementCloseSubpath: // contains no point
break;
}
}
添加UIBezierPath*组合路径;在.h文件中,U可以使用如下方法:
combinedpath = [[UIBezierPath alloc]init];
CGPathApply(appendedBenzierPath.CGPath, (void *)combinedpath, MyCGPathApplierFunc);
[self setNeedsDisplay];
现在填写这些组合路径
- (void)drawRect:(CGRect)rect
{
[[UIColor blackColor] setStroke];
[combinedpath strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];
[combinedpath fill];
}
如果你有一条路径定义你的拼图块,如果你把它变成一个
CAShapeLayer
:
CAShapeLayer *myShapeLayer = [CAShapeLayer layer];
myShapeLayer.path = myBezierCurves.CGPath;
myShapeLayer.fillColor = [[UIColor blackColor] CGColor];
myShapeLayer.strokeColor = [[UIColor redColor] CGColor];
myShapeLayer.lineWidth = 2;
过了一段时间,我找到了获得这些结果的原因。 如果要创建一些填充路径,不应使用
moveToPoint
方法,而应使用moveToPoint
设置第一个点,然后使用addLineToPoint
,addCurveToPoint
等绘制所有线
完成绘制路径后,不要忘记发送closePath
消息
在我知道这一点之前,我使用不同的UIBezierPath实例绘制了拼图的每一面,并使用
moveToPoint
为每个路径设置了第一个点。谢谢你的建议,我得到了这个:它没有填充…我找到了原因,请查看我的答案。XCode说“实例方法”-addQuadCurveToPoint“未找到”
,与“MyCGPathApplierFunc”函数中的addCurveToPoint相同。因此,我在运行时出现错误-[UIBezierPath addCurveToPoint:]:无法识别的选择器发送到实例“删除该情况:kCGPathElementAddCurveToPoint和continueNow它没有绘制任何内容。空屏幕。当我实现drawRect
方法时,我只看到黑屏。我找到了原因,请看我的答案。我遇到了同样的问题,但我认为你的解决方案行不通。以拼图为例,右边缘和下边缘使用基本相同的三次贝塞尔曲线创建,第二条曲线只是另一条曲线的CGAffineTransform。即使不在第二条曲线上使用moveToPoint,变换似乎也会阻止两条曲线连接,因此填充的范围只是定义每一侧的曲线。如果有人对此有一个解决方案,其中转换仍然可以使用,请分享。@Victor Engel,我的解决方案正在工作,我在我的应用程序中使用它。你为什么要谈论CGA?我不是用它来画拼图线。所有的贝塞尔曲线都是用每个贝塞尔曲线的坐标来绘制的。我并不是想说这是你的问题。我用你的插图来说明一个复杂问题。您可能不使用变换,但可以使用变换将一个坐标变换为另一个坐标,而无需计算其他坐标。我认为我的解决方案是将变换应用于CGPoints,这样就不需要变换路径。然后我可以将它们全部添加到一个路径中。我相信不需要closePath
,它是隐式调用的。@zakhej-Hey-mate!谢谢分享,你为我节省了几个小时:D