2

我正在做一些自定义控件。控件的其中一个子视图是透明的,并且绘制UIView了路径。UIBezierPath在其中一张照片上,我们只说边界UIBezierPath(称为 [路径笔划]),但在第二张照片上,您可以看到当我调用 [路径填充] 时会发生什么。我想要填充路径以创建类似于第一张照片上的形状。drawRect这个透明UIView的方法如下。

 - (void)drawRect:(CGRect)rect
{
// Drawing code
[super drawRect:rect];
UIBezierPath *path;
[[UIColor greenColor] setStroke];
[[UIColor greenColor] setFill];
//Angles

CGFloat startAngle = degreesToRadians(225);
CGFloat endAngle = degreesToRadians(315);

CGPoint center = CGPointMake(CGRectGetMidX(rect), lRadius);
path = [UIBezierPath bezierPathWithArcCenter: center radius:lRadius startAngle:startAngle endAngle:endAngle clockwise:YES];
rightEndOfLine = path.currentPoint;
bigArcHeight = rightEndOfLine.y;


CGFloat smallArcHeight = lRadius - bigArcHeight - sRadius;
CGFloat smallArcWidthSquare = (8*smallArcHeight*sRadius) - (4 * (smallArcHeight * smallArcHeight));
smallArcWidth = sqrtf(smallArcWidthSquare);


leftStartOfLine = CGPointMake((rect.size.width - smallArcWidth)/2, lRadius-sRadius + smallArcHeight);    
CGFloat lengthOfSpace = (rect.size.width - rightEndOfLine.x);

[path moveToPoint:leftStartOfLine];
[path addArcWithCenter:center radius:sRadius startAngle:startAngle endAngle:endAngle clockwise:YES];
rightStartOfLine = path.currentPoint;
leftEndOfLine = CGPointMake(lengthOfSpace, bigArcHeight);
[path moveToPoint:rightStartOfLine];
[path addLineToPoint:rightEndOfLine];
[path moveToPoint:leftStartOfLine];
[path addLineToPoint:leftEndOfLine];
[path closePath];
[path stroke];
 // [path fill];

 }

感谢帮助 !

第一张图片 第二张图片

4

1 回答 1

5

尝试删除所有 moveToPoint 调用。这是一个连续的形状,所以它们不是必需的,它们会混淆填充算法。你可以从左上角开始,顺时针画弧线,画线段(?)线,逆时针画弧线,然后画最后一条线段(或关闭路径)。这将正确填充。

于 2012-01-01T22:26:39.150 回答