Reputation: 2478
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
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:
Upvotes: 3