bezierPathWithRoundedRect 不是完美的圆

Posted

技术标签:

【中文标题】bezierPathWithRoundedRect 不是完美的圆【英文标题】:bezierPathWithRoundedRect not perfect circle 【发布时间】:2015-03-15 17:14:59 【问题描述】:

画圈有问题:

这个简单的代码表明:

- (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"];


我们有结果

前三个圆圈是按上面的方法画的,最后一个圆圈是我用PS画的。 如果您可以看到 bezierPathWithRoundedRect 绘制的不是具有正确半径的完美圆,我认为(一些角添加到圆中)。如何在图片中画出最后一个圆圈一样的圆圈?

PS:我的项目需要使用 bezierPathWithArcCenter,但是当我重用 bezierPathWithRoundedRect 时,我遇到了同样的问题!

【问题讨论】:

圆角矩形是带圆角的矩形。一个圆圈就是一个圆圈。如果你想要一个圆圈,就画一个圆圈。 添加一些上下文。从数学上讲,贝塞尔曲线是参数三次多项式的加权和。它们用途广泛,但它们不会为原始形状提供相同的结果。另外,不要对此投反对票;这是个好问题。 @boyfarrell,请检查更新问题。 为什么要在这里添加这个?问一个不同的问题。并将其设为已回答。 @boyfarrell 你是对的,但不是回答,bezierPathWithOvalInRect = 结果是一样的 【参考方案1】:

您需要使用+ (NSBezierPath *)bezierPathWithOvalInRect:(NSRect)aRect 来表示一个圈子。

根据定义,RoundedRect 是方形的。

【讨论】:

bezierPathWithOvalInRect 也有同样的问题,请检查!【参考方案2】:

要画圆,你需要使用圆弧。

看appendBezierPathWithArcFromPoint:toPoint:radius:

Ovals are not ellipses(尽管它们通常在英语中互换使用)。椭圆是泛化圆。

【讨论】:

【参考方案3】:

我发现最好的结果是在drawRect:中使用CGContextAddEllipseInRect:

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

【讨论】:

以上是关于bezierPathWithRoundedRect 不是完美的圆的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 错误的图像加载了自定义单元格和 UIView