iPhone - Draw transparent rectangle on UIView to reveal view beneath iPhone - Draw transparent rectangle on UIView to reveal view beneath ios ios

iPhone - Draw transparent rectangle on UIView to reveal view beneath


You have to override the top view's drawRect method. So, for example, you might create a HoleyView class that derives from UIView (you can do that by adding a new file to your project, selecting Objective-C subclass, and setting "Subclass of" to UIView). In HoleyView, drawRect would look something like this:

- (void)drawRect:(CGRect)rect {    // Start by filling the area with the blue color    [[UIColor blueColor] setFill];    UIRectFill( rect );    // Assume that there's an ivar somewhere called holeRect of type CGRect    // We could just fill holeRect, but it's more efficient to only fill the    // area we're being asked to draw.    CGRect holeRectIntersection = CGRectIntersection( holeRect, rect );    [[UIColor clearColor] setFill];    UIRectFill( holeRectIntersection );}

If you're using Interface builder, make sure to change the holey view's class to HoleyView. You can do that by selecting in the view in Interface Builder and selecting the "Identity" pane in the inspector (its the one on the far right the the "i" icon).

You also have to set the top view to be non-opaque either with the following code snippet, or by un-checking the Opaque checkbox in the view's properties in Interface Builder (you'll find it in the View section of the view's attributes) and set its background color's opacity to 0% (background color is set in the same section).

topView.opaque = NO;topView.backgroundColor = [UIColor clearColor];

If you want to do circles, you have to use Core Graphics (aka Quartz 2D). You'll probably want to read the programming guide, which is available here.

To draw an ellipse instead of the rectangle, your drawRect would look something like this:

- (void)drawRect:(CGRect)rect {    // Get the current graphics context    CGContextRef context = UIGraphicsGetCurrentContext();    CGContextSetFillColorWithColor( context, [UIColor blueColor].CGColor );    CGContextFillRect( context, rect );    if( CGRectIntersectsRect( holeRect, rect ) )    {        CGContextSetFillColorWithColor( context, [UIColor clearColor].CGColor );        CGContextFillEllipseInRect( context, holeRect );    }}


There is truth in all the other answers, but it is quite possible to draw with clear colour, or so to say erase the existing colours within any path, even with the -[UIBezierPath fill] or similar convenience methods. All you have to do is to set the context blend mode to an appropriate value depending on the effect you are trying to achieve, like so:

CGContextSetBlendMode(context, kCGBlendModeClear);[[UIColor clearColor] set];[myArbitraryPolygonPath fill];

There are around two dozen different options you could choose from, take a look around the CGContext reference.


to draw an ellipse, instead of a rect, just set the blendMode to clear:

- (void)drawRect:(CGRect)rect {    CGContextRef context = UIGraphicsGetCurrentContext();    CGContextSetFillColorWithColor( context, [UIColor blackColor].CGColor );    CGContextFillRect( context, rect );    CGRect holeRectIntersection = CGRectIntersection( holeRect, rect );    CGContextSetFillColorWithColor( context, [UIColor clearColor].CGColor );    CGContextSetBlendMode(context, kCGBlendModeClear);    CGContextFillEllipseInRect( context, holeRect );}