Display the user's location
Display the user's location on a map with the default user location puck.
ViewController.swift
import UIKitimport MapboxMaps public class ViewController: UIViewController { internal var mapView: MapView!internal var cameraLocationConsumer: CameraLocationConsumer!internal let toggleBearingImageButton: UIButton = UIButton(frame: .zero)internal var showsBearingImage: Bool = false {didSet {syncPuckAndButton()}}override public func viewDidLoad() {super.viewDidLoad() // Set initial camera settingslet options = MapInitOptions(cameraOptions: CameraOptions(zoom: 15.0)) mapView = MapView(frame: view.bounds, mapInitOptions: options)mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]view.addSubview(mapView) // Setup and create button for toggling show bearing imagesetupToggleShowBearingImageButton() cameraLocationConsumer = CameraLocationConsumer(mapView: mapView) // Add user position icon to the map with location indicator layermapView.location.options.puckType = .puck2D() // Allows the delegate to receive information about map events.mapView.mapboxMap.onNext(.mapLoaded) { _ in// Register the location consumer with the map// Note that the location manager holds weak references to consumers, which should be retainedself.mapView.location.addLocationConsumer(newConsumer: self.cameraLocationConsumer) self.finish() // Needed for internal testing purposes.}} @objc func showHideBearingImage() {showsBearingImage.toggle()} func syncPuckAndButton() {// Update puck configlet configuration = Puck2DConfiguration.makeDefault(showBearing: showsBearingImage) mapView.location.options.puckType = .puck2D(configuration) // Update button titlelet title: String = showsBearingImage ? "Hide bearing image" : "Show bearing image"toggleBearingImageButton.setTitle(title, for: .normal)} private func setupToggleShowBearingImageButton() {// StylingtoggleBearingImageButton.backgroundColor = .systemBluetoggleBearingImageButton.addTarget(self, action: #selector(showHideBearingImage), for: .touchUpInside)toggleBearingImageButton.setTitleColor(.white, for: .normal)syncPuckAndButton()toggleBearingImageButton.translatesAutoresizingMaskIntoConstraints = falseview.addSubview(toggleBearingImageButton) // ConstraintstoggleBearingImageButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20.0).isActive = truetoggleBearingImageButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20.0).isActive = truetoggleBearingImageButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -100.0).isActive = true}} // Create class which conforms to LocationConsumer, update the camera's centerCoordinate when a locationUpdate is receivedpublic class CameraLocationConsumer: LocationConsumer {weak var mapView: MapView? init(mapView: MapView) {self.mapView = mapView} public func locationUpdate(newLocation: Location) {mapView?.camera.ease(to: CameraOptions(center: newLocation.coordinate, zoom: 15),duration: 1.3)}}