Sept 26th 2012 update :for erasing iOS6 base maps look here: https://blog.sumbera.com/2012/09/26/how-to-erase-ios6-maps-in-mapkit/
I have searched this and couldn’t find any answer, so here is my own research so far on this subject. You can disable MapKit base layers using 3 approaches:
#1 remove subview from MKMapView (quite bad as you will loose all overlays too)
#2 use undocumented function (bad too as this will be rejected by Apple approval process):
// get MKMapTileView from view hierarchy UIView * mkMapTileView = [((UIView*) [ ((UIView*)[self.subviews objectAtIndex:0]). subviews objectAtIndex:0]).subviews objectAtIndex:0]; // call undocumented method if ( [mkMapTileView respondsToSelector:@selector(setDrawingEnabled:)]){ [mkMapTileView performSelector:@selector(setDrawingEnabled:) withObject:(id) NO];
#3 use method swizzle
inspired by http://www.mikeash.com/pyblog/friday-qa-2010-01-29-method-replacement-for-fun-and-profit.html
http://atastypixel.com/blog/making-uitoolbar-and-uinavigationbars-background-totally-transparent/
this method is fine as it is official method and enables you to ‘subclass’ a class that you don’t have access in compile time.
#import <objc/runtime.h> // original method declaration static void (*_origDrawLayerInContext)(id, SEL, CALayer*, CGContextRef); // set up subclass in runtime..in some entering method UIView * mkMapTileView = [((UIView*) [ ((UIView*)[self.subviews objectAtIndex:0]). subviews objectAtIndex:0]).subviews objectAtIndex:0]; Method origMethod = class_getInstanceMethod([mkMapTileView class], @selector(drawLayer:inContext:)); _origDrawLayerInContext = (void *)method_getImplementation(origMethod); if(!class_addMethod([mkMapTileView class], @selector(drawLayer:inContext:), (IMP)OverrideDrawLayerInContext, method_getTypeEncoding(origMethod))) method_setImplementation(origMethod, (IMP)OverrideDrawLayerInContext); // implement our Override static void OverrideDrawLayerInContext(UIView *self, SEL _cmd, CALayer *layer, CGContextRef context) { // possibly call original method if you leave it empty base google maps will not be displayed. You can draw custom content here as well... // _origDrawLayerInContext(self, _cmd, layer, context);
}