3

我正在尝试实现自定义视图。此视图应显示由灰色圆形矩形边框包围的图像。我可以让图像和边框正常显示,但是,由于边框有圆角,我需要一种方法来清除这些角,以便它们正确显示视图后面的任何内容。我怎样才能做到这一点?

似乎我可以使用CGContextClearRect,但是我不必多次调用它,重建圆角之外的区域吗?这听起来过于复杂。

有没有更好的方法来创建这个视图?

这是我当前的代码:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    // Draw the image. This will completely fill the current rect.
    [image drawInRect:self.bounds];

    // Ensure we draw completely within our bounds instead of straddling it.
    CGRect rrect = self.bounds;
    rrect.size.height = rrect.size.height - 1.0;
    rrect.size.width = rrect.size.width - 1.0;
    rrect.origin.x = rrect.origin.x + (1.0 / 2);
    rrect.origin.y = rrect.origin.y + (1.0 / 2);

    CGFloat radius = 5.0;
    CGFloat minx = CGRectGetMinX(rrect);
    CGFloat midx = CGRectGetMidX(rrect);
    CGFloat maxx = CGRectGetMaxX(rrect);
    CGFloat miny = CGRectGetMinY(rrect);
    CGFloat midy = CGRectGetMidY(rrect);
    CGFloat maxy = CGRectGetMaxY(rrect);

    // Draw the rounded rect border.
    CGContextSetRGBStrokeColor(context, 0.6, 0.6, 0.6, 1.0);
    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 0.0);
    CGContextSetLineWidth(context, 1.0);
    CGContextMoveToPoint(context, minx, midy);
    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathFillStroke);
}
4

2 回答 2

7

在绘制图像之前将圆角矩形路径添加到剪切路径。

于 2009-04-14T16:38:19.903 回答
0

上周我试图做类似的事情。

对于您的问题、答案和其他问答,我创建了一个带有解决方案的示例。

https://github.com/GabrielMassana/TransparentRoudRectButton

在此处输入图像描述

于 2015-01-06T09:53:14.833 回答