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