2015-03-15 4 views
1

У меня есть некоторые проблемы с дро кругом:bezierPathWithRoundedRect не идеальный круг

Это просто код демонстрирует, что:

- (void)drawRect:(CGRect)rect { 

    self.layer.sublayers = nil; 
    CGFloat radius = self.frame.size.width/2; 

    circle = [CAShapeLayer layer]; 
    circle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.width) cornerRadius:radius].CGPath; 

    circle.fillColor = [UIColor clearColor].CGColor; 
    circle.strokeColor = [UIColor redColor].CGColor; 

    circle.lineWidth = 4; 

    [self.layer addSublayer:circle]; 

    CABasicAnimation *drawAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; 

    drawAnimation.duration   = 1.0; // "animate over 10 seconds or so.." 
    drawAnimation.repeatCount   = 1.0; // Animate only once.. 

    drawAnimation.fromValue = [NSNumber numberWithFloat:0]; 
    drawAnimation.toValue = [NSNumber numberWithFloat:1]; 

    drawAnimation.removedOnCompletion = NO; 
    drawAnimation.fillMode = kCAFillModeForwards; 

    drawAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 

    drawAnimation.delegate = self; 
    [circle addAnimation:drawAnimation forKey:@"drawCircleAnimation"]; 

} 

И мы имеем результат

enter image description here Первые три круга рисует описанным выше способом, последний круг я рисую в PS. Если вы можете видеть, что bezierPathWithRoundedRect рисует не идеальный круг с правильным радиусом, я думаю (некоторые углы добавлены в круг). Как нарисовать круг как последний круг на картинке?

PS: Мне нужно использовать bezierPathWithArcCenter для моего проекта, но когда я повторно использую bezierPathWithRoundedRect, у меня такая же проблема!

+6

Закругленный прямоугольник представляет собой прямоугольник со скругленными углами. Круг - это круг. Если вам нужен круг, нарисуйте круг. – matt

+0

Чтобы добавить немного контекста. Математически говоря, кривые Безье представляют собой взвешенные суммы параметрических кубических многочленов. Они чрезвычайно универсальны, но они не дадут одинаковых результатов примитивным формам. Кроме того, не голосуйте за это; это хороший вопрос. –

+0

@boyfarrell, pls проверка обновление вопрос. –

ответ

1

Для круга необходимо использовать + (NSBezierPath *)bezierPathWithOvalInRect:(NSRect)aRect.

По определению RoundedRect является квадратным.

+0

bezierPathWithOvalInRect есть одинаковые проблемы, PLS проверка! –

0

Лучший результат я нашел использовать CGContextAddEllipseInRect: в drawRect:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGRect boundingRect = CGRectMake(2.0f, 2.0f, CGRectGetWidth(self.bounds)-4.0, CGRectGetHeight(self.bounds)-4.0); 
    CGContextSetLineWidth(context, 3.0); 
    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); 
    CGContextBeginPath(context); 
    CGContextAddEllipseInRect(context, boundingRect); 
    CGContextDrawPath(context, kCGPathFillStroke); 
    UIGraphicsEndImageContext(); 
} 
Смежные вопросы