I\'m overriding drawRect: in one of my views and it works even without calling [super drawrect:rect]. How does that work?
- (void)drawRect:(CGRect)rect{
C
Basically, it works because the machinery that sets up the graphics context for drawing, etc, doesn't live in the UIView
implementation of -drawRect:
(which is empty).
That machinery does live somewhere, of course, let's pretend in every UIView there's some internal method like this-- names of methods, functions, and properties are invented to protect the innocent:
- (void)_drawRectInternal:(CGRect)rect
{
// Setup for drawing this view.
_UIGraphicsContextPushTransform(self._computedTransform);
// Call this object's implementation of draw (may be empty, or overridden).
[self drawRect:rect];
// draw our subviews:
for (UIView * subview in [self subviews]) {
[subview _drawRectInternal:rect];
}
// Teardown for this view.
_UIGraphicsContextPopTransform();
}
This is a cleaner way of building the frameworks than relying on a subclasser to do the right thing in a common override, where getting it wrong would have result in very puzzling bad behavior. (And this wouldn't really be possible at all since the draw might need a setup and a teardown step.)