Как я могу удалить UIView с закругленными углами из родительского представления? - PullRequest
1 голос
/ 03 декабря 2010

Я создаю приложение для iPad версии 3.2 и выше.Мое приложение имеет вид наложения, который имеет полупрозрачность, которая делает все под ним темнее.В середине этого представления я пробиваю отверстие в этой полупрозрачности, чтобы пропустить часть фонового фильтра без повреждений, с помощью следующего кода:

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGRect intersection = CGRectIntersection(hole.frame, rect);
    CGContextClearRect(context, intersection);
}

Кроме того, представление «отверстия» имеет закругленные углыприменяется через:

self.layer.cornerRadius = 4.25;

Это прекрасно работает, за исключением одной маленькой проблемы - эти закругленные углы не учитываются, поэтому вместо того, чтобы скругляться, выбитое отверстие имеет квадратные углы.Мне нужно это исправить, но я понятия не имею, как.Есть идеи, примеры, мысли?

Ответы [ 3 ]

3 голосов
/ 09 декабря 2010

Вот как я в итоге заставил его работать.Это создает дыру с той же рамкой, что и у «дыры» UIView, вырезая ее из себя (UIView).Это позволяет вам видеть все, что находится за «дырой», беспрепятственно.

- (void)drawRect:(CGRect)rect {
    CGFloat radius = self.hole.layer.cornerRadius;
    CGRect c = self.hole.frame;
    CGContextRef context = UIGraphicsGetCurrentContext();

        // this simply draws a path the same shape as the 'hole' view
    CGContextMoveToPoint(context, c.origin.x, c.origin.y + radius);
    CGContextAddLineToPoint(context, c.origin.x, c.origin.y + c.size.height - radius);
    CGContextAddArc(context, c.origin.x + radius, c.origin.y + c.size.height - radius, radius, M_PI_4, M_PI_2, 1);
    CGContextAddLineToPoint(context, c.origin.x + c.size.width - radius, c.origin.y + c.size.height);
    CGContextAddArc(context, c.origin.x + c.size.width - radius, c.origin.y + c.size.height - radius, radius, M_PI_2, 0.0f, 1);
    CGContextAddLineToPoint(context, c.origin.x + c.size.width, c.origin.y + radius);
    CGContextAddArc(context, c.origin.x + c.size.width - radius, c.origin.y + radius, radius, 0.0f, -M_PI_2, 1);
    CGContextAddLineToPoint(context, c.origin.x + radius, c.origin.y);
    CGContextAddArc(context, c.origin.x + radius, c.origin.y + radius, radius, -M_PI_2, M_PI, 1);

        // finish
    CGContextClosePath(context);
    CGContextClip(context); // this is the secret sauce
    CGContextClearRect(context, c);
}
1 голос
/ 04 декабря 2010

То, что вы пытаетесь сделать, называется маскировкой. Вы можете использовать Core Graphics для маскировки текущего графического контекста. См. Документацию Apple по этому вопросу здесь:

http://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_images/dq_images.html#//apple_ref/doc/uid/TP30001066-CH212-CJBHDDBE

0 голосов
/ 04 декабря 2010

Если вы измените свойство cornerRadius слоя, вы также должны установить clipsToBounds на YES в связанном представлении, чтобы содержимое было обрезано по закругленным углам.

...