Как очистить углы за пределами скругленного прямоугольника с помощью iPhone SDK? - PullRequest
3 голосов
/ 14 апреля 2009

Я пытаюсь реализовать пользовательское представление. В этом представлении должно отображаться изображение, окруженное серой скругленной прямоугольной рамкой. Я могу сделать так, чтобы изображение отображалось нормально, а также границы, однако, поскольку граница имеет закругленные углы, мне нужен способ очистить эти углы так, чтобы они правильно отображали все, что находится позади вида. Как мне это сделать?

Кажется, что я мог бы использовать 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);
}

Ответы [ 2 ]

7 голосов
/ 14 апреля 2009

Добавьте прямоугольник с закругленными углами к обтравочному контуру перед рисованием изображения.

0 голосов
/ 06 января 2015

На прошлой неделе я пытался сделать что-то подобное.

С вашим вопросом, ответом и другими вопросами и ответами я создал пример с решением.

https://github.com/GabrielMassana/TransparentRoudRectButton

enter image description here

...