Skip to main content

Get started with maps

Last updated: April 16, 2026 | 2 minutes read

Learn how to display a map view and work with MapViewController, the core iOS map runtime controller.

Display a map

MapViewController is the UIKit map controller. In SwiftUI, use MapBase inside MapReader.

final class MapHostViewController: UIViewController, MapViewControllerDelegate {
private var mapViewController: MapViewController?

override func viewDidLoad() {
super.viewDidLoad()

let controller = MapViewController()
controller.delegate = self
controller.view.backgroundColor = .systemBackground
mapViewController = controller

addChild(controller)
view.addSubview(controller.view)
controller.didMove(toParent: self)

controller.view.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
controller.view.topAnchor.constraint(equalTo: view.topAnchor),
controller.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
controller.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
controller.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
])
}

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
mapViewController?.startRender()
}

override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
mapViewController?.stopRender()
}

deinit {
mapViewController?.destroy()
}

func mapViewControllerReady(_ mapViewController: MapViewController) {
// Map is ready for interaction
}
}
Default Map View

Use map preferences

Use getPreferences() for style, gestures, cursor, route rendering, landmark visibility, and other view-level settings.

guard let mapViewController,
let preferences = mapViewController.getPreferences() else {
return
}

preferences.enableCursor(true)
preferences.enableCursorRender(true)
mapViewController.setBuildingsVisibility(.visibilityHide)
Tip

You can instantiate multiple MapViewController instances or multiple MapBase views in one app. Some SDK-level settings are still global (for example language and unit system), while map view preferences are per-controller.