【发布时间】:2012-09-05 10:20:45
【问题描述】:
我正在尝试动态创建拼图,它看起来像这样:
我想用一些颜色填充这个形状,使它看起来像这样:
所以我可以用它来掩盖一些图像。
问题:
我用 4 个 UIBezierPath 创建了这个形状,然后使用 appendPath 将其转换为 1 个路径。
我想填充这条路径,但是当我使用 fill 时,我得到了这个:
您知道如何填充相同的形状吗?
【问题讨论】:
我正在尝试动态创建拼图,它看起来像这样:
我想用一些颜色填充这个形状,使它看起来像这样:
所以我可以用它来掩盖一些图像。
问题:
我用 4 个 UIBezierPath 创建了这个形状,然后使用 appendPath 将其转换为 1 个路径。
我想填充这条路径,但是当我使用 fill 时,我得到了这个:
您知道如何填充相同的形状吗?
【问题讨论】:
一段时间后,我找到了获得这些结果的原因。
如果要创建填充路径,则不应使用moveToPoint 方法,而应使用moveToPoint 设置第一个点,然后使用addLineToPoint、addCurveToPoint 等绘制所有线条。
完成绘制路径后,不要忘记发送closePath 消息。
在我知道这一点之前,我使用不同的 UIBezierPath 实例绘制了拼图的每一面,并使用moveToPoint为每条路径设置了第一个点。
【讨论】:
closePath 是不需要的,它是隐式调用的。
如果你有一个定义你的拼图的路径,如果你把它变成CAShapeLayer,操作起来会更容易:
CAShapeLayer *myShapeLayer = [CAShapeLayer layer];
myShapeLayer.path = myBezierCurves.CGPath;
myShapeLayer.fillColor = [[UIColor blackColor] CGColor];
myShapeLayer.strokeColor = [[UIColor redColor] CGColor];
myShapeLayer.lineWidth = 2;
【讨论】:
试试这个:打算用所有组合点制作一个 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];
}
【讨论】:
"Instance method '-addQuadCurveToPoint' not found",与“MyCGPathApplierFunc”函数中的 addCurveToPoint 相同。所以我在运行时出错"-[UIBezierPath addCurveToPoint:]: unrecognized selector sent to instance"
drawRect 方法时,我只看到黑屏。并且没有绘制任何东西。