Zoltan Varadi
Zoltan Varadi

Reputation: 2478

iOS Swift MKMapView remove map tiles

In my app I want to display the annotations on a MKMapView, but I don't want the user to see the map tiles, I want them to be completely black. How can I achieve that look?

Upvotes: 2

Views: 1298

Answers (1)

Péter Kovács
Péter Kovács

Reputation: 280

The mechanism of replacing the map tiles is based on the MKOverlayRenderer class. You need make your own MKOverlayRenderer subclass where you can customise the displaying of the map tiles. In the ViewController where you are using your map, you need to add an overlay to your MKMapView to trigger the MKMapViewDelegate's rendering method.

Example code:

//Subclass of MKOverlayRenderer to tint the tiles
class MyCustomOverlayRenderer: MKOverlayRenderer {
    override func draw(_ mapRect: MKMapRect, zoomScale: MKZoomScale, in context: CGContext) {
        let drawRect = self.rect(for: mapRect)
        context.setFillColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0)
        context.fill(drawRect)
    }
}

//Custom View Controller where the map can be found
class ViewController: UIViewController {

        @IBOutlet weak var mapView: MKMapView!

        override func viewDidLoad() {
            super.viewDidLoad()

            self.mapView.delegate = self

            let tiles = MKTileOverlay(urlTemplate: nil)
            tiles.canReplaceMapContent = true
            self.mapView.add(tiles)
       }

       //Custom method to add an annotation onto your mapView
       @IBAction func mapViewTapped(_ sender: Any) {

            let annotation = MyCustomAnnotation(coordinate: self.mapView.centerCoordinate, title: "MyAnnotation")
            self.mapView.addAnnotation(annotation)
        }
}

extension ViewController : MKMapViewDelegate
{
    //use your custom renderer to render all tiles
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        return MyCustomOverlayRenderer(overlay: overlay)
    }

    //show a pin in the middle of you map
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

        return nil
    }
}

And the result is:

Result

Upvotes: 3

Related Questions