UIView overriding drawRect causes view not to obey masksToBounds

drawrect, ios, ios6, uiview

Solution

I don't know the full answer, but I do know that UIView's implementation of `drawLayer:inContext:` works differently depending on whether you have implemented `drawRect:` or not. Perhaps masking/clipping to bounds is one of those things it does differently.

You can try solving your issue a number of ways:

make your background transparent:

    layer.backgroundColor = [UIColor clearColor].CGColor;

clip yourself inside your custom `drawRect:`:

- (void)drawRect:(CGRect)rect {
    [[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:30.0] addClip];
    [image drawInRect:rect];  // or whatever
}

carve out the corners explicitly:

CGContextBeginPath(c);
CGContextAddArc(c, r, r, r, M_PI, 3*M_PI_2, 0);
CGContextAddLineToPoint(c, 0, 0);
CGContextClosePath(c);
CGContextClip(c);
[[UIColor grayColor] setFill];
UIRectFill(rect);

I stole those last 2 suggestions from this great presentation from WWDC 2010: Advanced Performance Optimization on iPhone OS (video listed at this index page -- annoyingly, no direct link).

Problem

I am trying to override the `drawRect:` method of UIView in my custom view. However, my view has a border radius defined as: ``` sub = [[[NSBundle mainBundle] loadNibNamed:@"ProfileView" owner:self options:nil] objectAtIndex:0]; [self addSubview:sub]; [sub setUserInteractionEnabled:YES]; [self setUserInteractionEnabled:YES]; CALayer *layer = sub.layer; layer.masksToBounds = YES; layer.borderWidth = 5.0; layer.borderColor = [UIColor whiteColor].CGColor; layer.cornerRadius = 30.0; ``` This works perfectly and places a nice border with a border radius around my view (don't mind the diagonal/straight white lines at the back, they have nothing to do with this view): However, when I try to override the `drawRect:` method in my view, I can see a black background not masking to bounds. I don't do anything (currently), here is my code: ``` -(void)drawRect:(CGRect)rect{ [super drawRect:rect]; } ``` And here is the result: I've changed nothing but the draw method. How can I override the draw method while keeping my view obey the corner radius mask? Is this a bug in iOS or am I missing something?

Original source