In this page

Custom Location Source

这篇文档目前尚未提供译文,将以原文展示。

This example shows how to customize your location data source for NGLMapView.

  1. Custom your location data source for NGLMapView

For all code examples, refer to Maps Code Examples

CustomLocationSourceViewController view source

1import Foundation
2import UIKit
3import Nbmap
4class CustomLocationSourceViewController: UIViewController {
5    var nbMapView: NGLMapView! {
6        didSet {
7            oldValue?.removeFromSuperview()
8            if let mapView = nbMapView {
9                view.insertSubview(mapView, at: 0)
10            }
11        }
12    }
13    override func viewDidLoad() {
14        super.viewDidLoad()
15        nbMapView = NGLMapView(frame:self.view.bounds)
16        nbMapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
17        
18        /**
19         Custom the location source , The locationManager that this map view uses to start and stop the delivery of
20         location-related updates.
21         To receive the current user location, implement the
22         `-[NGLMapViewDelegate mapView:didUpdateUserLocation:]` and
23         `-[NGLMapViewDelegate mapView:didFailToLocateUserWithError:]` methods.
24         If setting this property to `nil` or if no custom manager is provided this
25         property is set to the default location manager.
26         `NGLMapView` uses a default location manager. If you want to substitute your
27         own location manager, you should do so by setting this property before setting
28         `showsUserLocation` to `YES`. To restore the default location manager,
29         set this property to `nil`.
30         */
31        nbMapView.locationManager = CustomMapLocationManager()
32        nbMapView.showsUserLocation = true
33        nbMapView.userTrackingMode = .follow
34    }
35}

CustomMapLocationManager

1import Nbmap
2import CoreLocation
3class CustomMapLocationManager: NSObject,NGLLocationManager {
4    
5    var delegate: NGLLocationManagerDelegate? {
6        didSet {
7            locationManager.delegate = self
8        }
9    }
10    
11    // Replay with your own location manager
12    private let locationManager = CLLocationManager()
13    
14    var headingOrientation: CLDeviceOrientation {
15        get {
16            return locationManager.headingOrientation
17        }
18        set {
19            locationManager.headingOrientation = newValue
20        }
21    }
22    
23    var desiredAccuracy: CLLocationAccuracy {
24        get {
25            return locationManager.desiredAccuracy
26        }
27        set {
28            locationManager.desiredAccuracy = newValue
29        }
30    }
31    
32    var authorizationStatus: CLAuthorizationStatus {
33        if #available(iOS 14.0, *) {
34            return locationManager.authorizationStatus
35        } else {
36            return CLLocationManager.authorizationStatus()
37        }
38    }
39    
40    var activityType: CLActivityType {
41        get {
42            return locationManager.activityType
43        }
44        set {
45            locationManager.activityType = newValue
46        }
47    }
48    
49    @available(iOS 14.0, *)
50    var accuracyAuthorization: CLAccuracyAuthorization {
51        return locationManager.accuracyAuthorization
52    }
53    
54    @available(iOS 14.0, *)
55    func requestTemporaryFullAccuracyAuthorization(withPurposeKey purposeKey: String) {
56        locationManager.requestTemporaryFullAccuracyAuthorization(withPurposeKey: purposeKey)
57    }
58    
59    func dismissHeadingCalibrationDisplay() {
60        locationManager.dismissHeadingCalibrationDisplay()
61    }
62    
63    func requestAlwaysAuthorization() {
64        locationManager.requestAlwaysAuthorization()
65    }
66    
67    func requestWhenInUseAuthorization() {
68        locationManager.requestWhenInUseAuthorization()
69    }
70    
71    func startUpdatingHeading() {
72        locationManager.startUpdatingHeading()
73    }
74    
75    func startUpdatingLocation() {
76        locationManager.startUpdatingLocation()
77    }
78    
79    func stopUpdatingHeading() {
80        locationManager.stopUpdatingHeading()
81    }
82    
83    func stopUpdatingLocation() {
84        locationManager.stopUpdatingLocation()
85    }
86    
87    deinit {
88        locationManager.stopUpdatingLocation()
89        locationManager.stopUpdatingHeading()
90        locationManager.delegate = nil
91        delegate = nil
92    }
93    
94}
95// MARK: - CLLocationManagerDelegate
96extension CustomMapLocationManager : CLLocationManagerDelegate {
97  
98    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
99        delegate?.locationManager(self, didUpdate: locations)
100    }
101    
102    func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
103        delegate?.locationManager(self, didUpdate: newHeading)
104    }
105    
106    func locationManagerShouldDisplayHeadingCalibration(_ manager: CLLocationManager) -> Bool {
107        return delegate?.locationManagerShouldDisplayHeadingCalibration(self) ?? false
108    }
109    
110    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
111        delegate?.locationManager(self, didFailWithError: error)
112    }
113    
114    @available(iOS 14.0, *)
115    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
116        delegate?.locationManagerDidChangeAuthorization(self)
117    }
118}

The example code implements a custom location source (CustomLocationSourceViewController) along with a custom location manager (CustomMapLocationManager).

CustomLocationSourceViewController is a subclass of UIViewController responsible for displaying a map view and setting up a custom location source

  1. Initializing a map view (NGLMapView) and setting its frame to match the bounds of the current view.

  2. Adding the map view as a subview to the current view.

  3. Customizing the location source by assigning an instance of CustomMapLocationManager to the locationManager property of the map view.

  4. Setting showsUserLocation to true to display the user's location on the map.

  5. Setting userTrackingMode to .follow to track the user's location.

CustomMapLocationManager is a custom location manager that conforms to the NGLLocationManager protocol. It utilizes a CLLocationManager as its private property and sets itself as the delegate.

  1. It implements the NGLLocationManagerDelegate protocol by setting the locationManager delegate to itself.

  2. Various properties and methods of the location manager are mapped to the private locationManager instance using the delegate pattern.

  3. It implements methods from the CLLocationManagerDelegate protocol and forwards these methods to the delegate object.

Summary: The provided code establishes a custom location source by utilizing a custom location manager. By setting the custom location manager, it is possible to replace the default location manager and achieve more flexibility and customization in handling location-related updates and delegate callbacks.

没找到你要找的内容?