UIBezierPath添加了弧段,产生幻像三角形

时间:2014-02-20 03:55:37

标签: ios uibezierpath

我正在编写一种创建UIImageView的方法,其中包含一个透明的UIImage,左上角或右上角有一个圆角位(如果我将此图像添加到{{1}使用与视图后面的颜色相同的颜色,它会产生圆角的错觉 - 我知道CALayer的圆角,我不会因为某个原因而使用。

如果转角类型为UIView,则以下代码按预期工作。 UIRectCornerTopLeft情况在图像的右上角绘制了圆角位,但由于某种原因,它还添加了一个“幻影”填充三角形,其顶点从左上角到左下角到右下角然后回到左上角。我不知道这个幻影三角形来自哪里,因为我没有在任何地方指定左下角。

请帮助,我疯了。这是代码:

UIRectCornerTopRight

2 个答案:

答案 0 :(得分:1)

使用3/2 PI表示起始角度,2 PI表示结束角度

您可以参考有关如何指定角度的UIBezierPath文档。在第一个解决方案中,3/2 PI实际上是指由直线向上的线所形成的角度,因此弧从顶部开始,2 PI(相当于0,但不是在这里,因为我们需要指定方向,即顺时针方向) /逆时针)是由右边的线创建的角度(以度为单位,这是360度(我将再次指出它与0度在同一个地方),因此你的弧线在相交的点处结束从那个角度来看。

答案 1 :(得分:1)

这是更正后的版本,万一有人想要它。对我来说,只是一夜之间的愚蠢。

+ (UIImageView *)roundedCornerImageOfWidth:(CGFloat)width 
    withCornerBackgroundColor:(UIColor *)cornerColor 
    forCorner:(UIRectCorner)corner {

    CGRect rect = CGRectMake(0, 0, width, width);
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, width), NO, 0.0);
    CGContextRef context = UIGraphicsGetCurrentContext();

    // fill image with transparent background
    CGContextSetFillColorWithColor(context, [UIColor clearColor].CGColor);
    CGContextFillRect(context, rect);

    // set the color for solid corner
    CGContextSetFillColorWithColor(context, [cornerColor CGColor]);

    UIBezierPath *maskPath = [UIBezierPath bezierPath];


    switch (corner) {
        case UIRectCornerTopLeft:
        {
            CGPoint pt;
            pt = CGPointMake(0, width); // lower left
            [maskPath moveToPoint:pt];
            pt = CGPointMake(0, 0); // upper left
            [maskPath addLineToPoint:pt];
            pt = CGPointMake(width, 0); // upper right
            [maskPath addLineToPoint:pt];
            // arc back to lower left
            [maskPath addArcWithCenter:CGPointMake(width, width) 
                radius:width startAngle:0 endAngle:0.5 * M_PI clockwise:NO];
        }
            break;

        case UIRectCornerTopRight:
        {
            // start at upper right
            CGPoint pt;
            pt = CGPointMake(width, 0);
            [maskPath moveToPoint:pt];
            // move to lower right
            pt = CGPointMake(width, width);
            [maskPath addLineToPoint:pt];
            // arc back to upper left
            [maskPath addArcWithCenter:CGPointMake(0, width) radius:width 
                startAngle:2 * M_PI endAngle:1.5 * M_PI clockwise:NO];
            // back to upper right
            pt = CGPointMake(width, 0);
            [maskPath addLineToPoint:pt];
        }
            break;

        default:
            break;
    }

    [maskPath closePath];
    [maskPath fill];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    imageView.backgroundColor = [UIColor clearColor];
    imageView.frame = CGRectMake(0, 0, width, width);

    return imageView;
}