Заполнение UIBezierPath неправильной формы - PullRequest
2 голосов
/ 02 января 2012

Я делаю пользовательский контроль.Одним из подпредставлений элемента управления является прозрачный 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];

 }

Спасибо за помощь!

First Image Second Image

1 Ответ

5 голосов
/ 02 января 2012

Попробуйте удалить все ваши вызовы moveToPoint. Это непрерывная форма, поэтому они не требуются, и они путают алгоритм заполнения. Вы можете начать с верхнего левого угла, нарисовать дугу по часовой стрелке, нарисовать линию сегмента (?), Нарисовать дугу против часовой стрелки, затем нарисовать последнюю линию сегмента (или закрыть путь). Это заполнит правильно.

...