2

我正在尝试动态创建拼图,它看起来像这样:
未填充的拼图
我想用一些颜色填充这个形状,所以它看起来像这样:
填充拼图
所以我可以用它来掩盖一些图像。
问题: 我用 4 UIBezierPath 创建了这个形状,然后使用appendPath.
我想填充这条路径,但是当我使用时,fill我得到了这个:
坏填充拼图
你有什么想法可以填充相同的形状吗?

4

3 回答 3

6

一段时间后,我找到了获得这些结果的原因。如果你想创建一些填充路径,你不应该使用moveToPoint方法,而应该只使用一次设置第一个点moveToPoint,然后用 , 等绘制所有addLineToPoint线条addCurveToPoint

完成绘制路径后,不要忘记发送closePath消息。

在我知道这一点之前,我使用不同的 UIBezierPath 实例绘制了拼图的每一面,并且对于我设置的第一点使用moveToPoint.

于 2012-09-07T10:11:27.680 回答
1

如果你有一个定义你的拼图的路径,如果你把它变成一个,操作起来会更容易CAShapeLayer

CAShapeLayer *myShapeLayer = [CAShapeLayer layer];
myShapeLayer.path = myBezierCurves.CGPath;
myShapeLayer.fillColor = [[UIColor blackColor] CGColor];

myShapeLayer.strokeColor = [[UIColor redColor] CGColor];
myShapeLayer.lineWidth = 2;
于 2012-09-05T10:35:13.513 回答
0

试试这个:打算用所有组合点制作一个 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 *combinedpath; 在 .h 文件中,你可以使用如下方法:

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];
}
于 2012-09-05T10:35:13.400 回答