2012-01-01 3 views
2

Я делаю заказной контроль. Одно из подсмотров элемента управления прозрачно UIView с UIBezierPath Нарисованный путь. На одной из фотографий есть, скажем, граница UIBezierPath (там называется [path stroke]), но на втором вы видите, что происходит, когда я вызываю [path fill]. Я хотел бы, чтобы путь был заполнен, чтобы создать форму, похожую на ту, что была на первой фотографии. drawRect способ из этого прозрачный UIView внизу.Неравномерное заполнение UIBezierPath

- (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

ответ

5

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

Смежные вопросы