In this page

Custom Map Camera Animation

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

This example shows how to customize the camera for NGLMapView. You can set the map camera or direction by use the following methods:

  1. setCenter

  2. setVisibleCoordinateBounds

  3. setVisibleCoordinates

  4. setCamera

  5. fly

  6. setDirection

  7. setZoomLevel

For all code examples, refer to Maps Code Examples

MapsCameraViewController view source

1import Foundation
2import UIKit
3import Nbmap
4enum CameraType{
5    case CameraSetCenterCoordinate
6    case CameraSetCenterCoordinateWithZoomLevel
7    case CameraSetCenterCoordinateWithZoomLevelAndDirection
8    case CameraSetCenterCoordinateWithZoomLevelAndDirectionCompletion
9    case SetZoomLevel
10    case SetDirection
11case SetVisibleCoordinateBounds
12    case SetVisibleCoordinateBoundsWithEdgePadding
13    case SetVisibleCoordinatesWithEdgePadding
14    case SetVisibleCoordinatesWithEdgePaddingAndDirectionAndDuration
15    case SetCamera
16    case SetCameraWithDuration
17    case SetCameraWithDurationAndCompletionHandler
18    case FlyToCamera
19    case FlyToCameraWithDuration
20    case FlyToCameraWithDurationAndPeakAltitude
21}
22class MapsCameraViewController: UIViewController {
23    
24    var nbMapView: NGLMapView! {
25        didSet {
26            oldValue?.removeFromSuperview()
27            if let mapView = nbMapView {
28                configureMapView(nbMapView)
29                view.insertSubview(mapView, at: 0)
30            }
31        }
32    }
33    
34    var button: UIButton!
35    
36    let typeList = [
37        CameraType.CameraSetCenterCoordinate,
38        CameraType.CameraSetCenterCoordinateWithZoomLevel,
39        CameraType.CameraSetCenterCoordinateWithZoomLevelAndDirection,
40        CameraType.CameraSetCenterCoordinateWithZoomLevelAndDirectionCompletion,
41        CameraType.SetZoomLevel,
42        CameraType.SetDirection,
43        CameraType.SetVisibleCoordinateBounds,
44        CameraType.SetVisibleCoordinateBoundsWithEdgePadding,
45        CameraType.SetVisibleCoordinatesWithEdgePadding,
46        CameraType.SetVisibleCoordinatesWithEdgePaddingAndDirectionAndDuration,
47        CameraType.SetCamera,
48        CameraType.SetCameraWithDuration,
49        CameraType.SetCameraWithDurationAndCompletionHandler,
50        CameraType.FlyToCamera,
51        CameraType.FlyToCameraWithDuration,
52        CameraType.FlyToCameraWithDurationAndPeakAltitude,
53    ]
54    
55    func configureMapView(_ mapView: NGLMapView) {
56        mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
57        
58        mapView.delegate = self
59    }
60    
61    override func viewDidLoad() {
62        super.viewDidLoad()
63        nbMapView = NGLMapView(frame:self.view.bounds)
64        
65        button = UIButton(type: .system)
66        button.setTitle("Settings", for: .normal)
67        button.addTarget(self, action: #selector(showSetings), for: .touchUpInside)
68        button.frame = CGRect(x: 0, y: 0, width: 100, height: 40)
69        navigationItem.rightBarButtonItem = UIBarButtonItem(customView: button)
70        
71    }
72    
73    @objc func showSetings() {
74        let tableViewController = UITableViewController(style: .plain)
75        tableViewController.tableView.delegate = self
76        tableViewController.tableView.dataSource = self
77        tableViewController.title = "Camera Settings"
78        self.present(tableViewController, animated: true)
79    }
80    
81    /**
82     Perform operations on the map based on user selection
83     @param type:  The type which user selected. user to perform operations on the map
84     */
85    func performeSettings(type: CameraType) {
86        switch type {
87        case CameraType.CameraSetCenterCoordinate :
88            nbMapView.setCenter(CLLocationCoordinate2DMake(53.5511, 9.9937),animated: true )
89            break
90        case .CameraSetCenterCoordinateWithZoomLevel:
91            nbMapView.setCenter(CLLocationCoordinate2DMake(53.5511, 9.9937),zoomLevel: 18 ,animated: true )
92            break
93        case CameraType.CameraSetCenterCoordinateWithZoomLevelAndDirection :
94            nbMapView.setCenter(CLLocationCoordinate2DMake(53.5511, 9.9937),zoomLevel: 18 ,direction: 180, animated: true )
95            break
96        case CameraType.CameraSetCenterCoordinateWithZoomLevelAndDirectionCompletion :
97            nbMapView.setCenter(CLLocationCoordinate2DMake(53.5511, 9.9937),zoomLevel: 18 ,direction: 180, animated: true ,completionHandler: {
98                
99            })
100            break
101        case CameraType.SetZoomLevel :
102            nbMapView.setZoomLevel(17, animated: true)
103            break
104        case CameraType.SetDirection :
105            nbMapView.setDirection(0, animated: true)
106            break
107        case .SetVisibleCoordinateBounds:
108            let coords = [
109                CLLocationCoordinate2DMake(53.5511, 9.9937),
110                CLLocationCoordinate2DMake(53.5311, 9.9947),
111                CLLocationCoordinate2DMake(53.5531, 9.9957),
112                CLLocationCoordinate2DMake(53.5521, 9.9967)
113            ]
114            let bounds = NGLPolygon(coordinates: coords, count: UInt(coords.count)).overlayBounds
115            //  Changes the receiver's viewport to fit the given coordinate bounds, optionally animating the change.
116            nbMapView.setVisibleCoordinateBounds(bounds,animated: true)
117            break
118        case .SetVisibleCoordinateBoundsWithEdgePadding:
119            let coords = [
120                CLLocationCoordinate2DMake(53.5511, 9.9937),
121                CLLocationCoordinate2DMake(53.5311, 9.9947),
122                CLLocationCoordinate2DMake(53.5531, 9.9957),
123                CLLocationCoordinate2DMake(53.5521, 9.9967)
124            ]
125            let bounds = NGLPolygon(coordinates: coords, count: UInt(coords.count)).overlayBounds
126            //  Changes the receiver's viewport to fit the given coordinate bounds with some additional padding on each side, optionally calling a completion handler.
127            nbMapView.setVisibleCoordinateBounds(bounds,edgePadding: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10),animated: true,completionHandler: {})
128            break
129        case .SetVisibleCoordinatesWithEdgePadding:
130            let coords = [
131                CLLocationCoordinate2DMake(53.5511, 9.9937),
132                CLLocationCoordinate2DMake(53.5313, 9.9947),
133                CLLocationCoordinate2DMake(53.5531, 9.9937),
134                CLLocationCoordinate2DMake(53.5526, 9.9968)
135            ]
136            //  Changes the receiver's viewport to fit all of the given coordinates with some additional padding on each side.
137            nbMapView.setVisibleCoordinates(coords,count: UInt(coords.count),edgePadding: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10),animated: true)
138            break
139        case .SetVisibleCoordinatesWithEdgePaddingAndDirectionAndDuration:
140            let coords = [
141                CLLocationCoordinate2DMake(53.5511, 9.9937),
142                CLLocationCoordinate2DMake(53.5313, 9.9987),
143                CLLocationCoordinate2DMake(53.5533, 9.9947),
144                CLLocationCoordinate2DMake(53.5529, 9.9938)
145            ]
146            let function: CAMediaTimingFunction? = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear)
147            //  Changes the receiver's viewport to fit all of the given coordinates with some additional padding on each side, optionally calling a completion handler.
148            nbMapView.setVisibleCoordinates(coords,count: UInt(coords.count),edgePadding: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10),direction:160, duration: 2, animationTimingFunction: function,completionHandler: nil)
149            break
150        case CameraType.SetCamera :
151            let camera =  NGLMapCamera(lookingAtCenter: CLLocationCoordinate2DMake(53.5511, 9.9937),
152                                       acrossDistance:1000,
153                                                pitch:0,
154                                              heading:0)
155            //  Moves the viewpoint to a different location with respect to the map with an
156            //  optional transition animation. For animated changes, wait until the map view has
157            //  finished loading before calling this method.
158            nbMapView.setCamera(camera, animated: true)
159            break
160        case .SetCameraWithDuration:
161            let camera =  NGLMapCamera(lookingAtCenter: CLLocationCoordinate2DMake(53.5511, 9.9937),
162                                       acrossDistance:1000,
163                                                pitch:0,
164                                              heading:0)
165            let function: CAMediaTimingFunction? = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear)
166            // Moves the viewpoint to a different location with respect to the map with an
167            // optional transition duration and timing function. For animated changes, wait
168            // until the map view has finished loading before calling this method.
169            nbMapView.setCamera(camera, withDuration: 1 ,animationTimingFunction: function)
170            break
171            
172        case   CameraType.SetCameraWithDurationAndCompletionHandler:
173            let function: CAMediaTimingFunction? = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear)
174            let camera =  NGLMapCamera(lookingAtCenter: CLLocationCoordinate2DMake(53.5511, 9.9937),
175                                       acrossDistance:1000,
176                                                pitch:0,
177                                              heading:0)
178            //  Moves the viewpoint to a different location with respect to the map with an
179            //  optional transition duration and timing function. For animated changes, wait
180            //  until the map view has finished loading before calling this method.
181            nbMapView.setCamera(camera, withDuration: 1 ,animationTimingFunction: function,completionHandler: {
182                
183            })
184            break
185        case CameraType.FlyToCamera :
186            let camera = NGLMapCamera(lookingAtCenter: CLLocationCoordinate2DMake(53.5511, 9.9937),
187                                       acrossDistance:1000,
188                                                pitch:0,
189                                              heading:0)
190            //  Moves the viewpoint to a different location using a transition animation that
191            //  evokes powered flight and a default duration based on the length of the flight path.
192            
193            // The transition animation seamlessly incorporates zooming and panning to help
194            // the user find his or her bearings even after traversing a great distance.
195            nbMapView.fly(to: camera)
196            break
197        case CameraType.FlyToCameraWithDuration :
198            let camera = NGLMapCamera(lookingAtCenter: CLLocationCoordinate2DMake(53.5511, 9.9937),
199                                       acrossDistance:1000,
200                                                pitch:0,
201                                              heading:0)
202            // Moves the viewpoint to a different location using a transition animation that
203            // evokes powered flight and an optional transition duration.
204            // The transition animation seamlessly incorporates zooming and panning to help
205            // the user find his or her bearings even after traversing a great distance.
206            nbMapView.fly(to: camera, withDuration: 2 , completionHandler: {
207                
208            })
209            break
210        case CameraType.FlyToCameraWithDurationAndPeakAltitude :
211            let camera = NGLMapCamera(lookingAtCenter: CLLocationCoordinate2DMake(53.5511, 9.9937),
212                                       acrossDistance:1000,
213                                                pitch:0,
214                                              heading:0)
215            
216            // Moves the viewpoint to a different location using a transition animation that
217            //  evokes powered flight and an optional transition duration and peak altitude.
218            // The transition animation seamlessly incorporates zooming and panning to help
219            // the user find his or her bearings even after traversing a great distance.
220            nbMapView.fly(to: camera, withDuration: 2 , peakAltitude: 1000 ,completionHandler: {
221                
222            })
223            break
224       
225        }
226        
227    }
228}
229extension MapsCameraViewController: NGLMapViewDelegate {
230    func mapView(_ mapView: NGLMapView, didFinishLoading style: NGLStyle){
231        
232        nbMapView.zoomLevel = 16.0
233        nbMapView.setCenter(CLLocationCoordinate2DMake(53.5511, 9.9937),animated: false)
234        
235    }
236}
237extension MapsCameraViewController: UITableViewDelegate, UITableViewDataSource {
238    
239    func settingsTitlesForRaw(index: Int) -> String {
240        let type = typeList[index]
241        switch type {
242            case CameraType.CameraSetCenterCoordinate :
243                return "Camera Set Center Coordinate"
244            case CameraType.CameraSetCenterCoordinateWithZoomLevelAndDirection :
245                return "Set center coordinate with zoom level and direction"
246            case CameraType.CameraSetCenterCoordinateWithZoomLevelAndDirectionCompletion :
247                return "Set center coordinate with zoom level and direction completion handler"
248            case CameraType.SetZoomLevel :
249                return "Set zoom level"
250            case CameraType.SetDirection :
251                return "Set direction"
252            case CameraType.SetVisibleCoordinateBounds :
253                return "Set visible coordinate bounds"
254            case CameraType.SetVisibleCoordinateBoundsWithEdgePadding :
255                return "Set visible coordinate bounds with edge padding"
256            case .SetVisibleCoordinatesWithEdgePadding:
257                return "Set visible coordinates with edge padding"
258            case .SetVisibleCoordinatesWithEdgePaddingAndDirectionAndDuration:
259                return "Set visible coordinates with edge padding and direction and direction"
260            case CameraType.SetCamera :
261                return "Set camera"
262            case CameraType.FlyToCamera :
263                return "Fly to camera"
264            case CameraType.FlyToCameraWithDuration :
265                return "Fly to camera with duration"
266            case CameraType.FlyToCameraWithDurationAndPeakAltitude :
267                return "Fly to camera with duration and peak altitude"
268            case .CameraSetCenterCoordinateWithZoomLevel:
269                return "Set center coordinate with zoom level"
270            case .SetCameraWithDurationAndCompletionHandler:
271                return "Set camera with duration and completion handler"
272            case .SetCameraWithDuration:
273                return "Set camera with duration"
274        }
275    }
276    // UITableViewDelegate 和 UITableViewDataSource 方法的实现
277     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
278         return typeList.count
279     }
280     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
281         let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
282         cell.textLabel?.text = settingsTitlesForRaw(index: indexPath.row)
283         return cell
284     }
285     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
286         tableView.isHidden = true
287         let type = typeList[indexPath.row]
288        dismissSettings(type: type)
289     }
290    
291    func dismissSettings(type: CameraType) {
292        dismiss(animated: true)
293        performeSettings(type: type)
294    }
295}
296

The given example demonstrates how to initialize a MapView and perform various operations on the nbMapView object.

Initializing MapView:

  1. The code initializes a NGLMapView object called nbMapView in the viewDidLoad() method. It sets the frame of the map view to match the bounds of the current view controller's view.

Operations on nbMapView: The code includes a performeSettings(type:) method that performs different operations on the nbMapView based on the selected CameraType. The following operations are performed:

  1. Camera Set Center Coordinate: Sets the center coordinate of the map view with optional animation.

  2. Camera Set Center Coordinate with Zoom Level: Sets the center coordinate of the map view with a specific zoom level and optional animation.

  3. Camera Set Center Coordinate with Zoom Level and Direction: Sets the center coordinate of the map view with a specific zoom level (18) and direction (180) and optional animation.

  4. Camera Set Center Coordinate with Zoom Level, Direction, and Completion: Sets the center coordinate of the map view with a specific zoom level (18), direction (180), and optional animation, along with a completion handler.

  5. Set Zoom Level: Sets the zoom level of the map view to 17 with optional animation.

  6. Set Direction: Sets the direction (heading) of the map view to 0 with optional animation.

  7. Set Visible Coordinate Bounds: Sets the visible coordinate bounds of the map view to a polygon defined by four coordinates, with optional animation.

  8. **Set Visible Coordinate Bounds with Edge Padding:

  9. **Sets the visible coordinate bounds of the map view to a polygon defined by four coordinates, with additional edge padding and optional animation.

  10. Set Visible Coordinates with Edge Padding: Sets the visible coordinates of the map view to an array of coordinates, with additional edge padding and optional animation.

  11. Set Visible Coordinates with Edge Padding, Direction, and Duration: Sets the visible coordinates of the map view to an array of coordinates, with additional edge padding, direction (160), duration (2 seconds), and optional animation.

  12. Set Camera: Moves the viewpoint of the map to a different location specified by a NGLMapCamera object, with optional animation.

  13. Set Camera with Duration: Moves the viewpoint of the map to a different location specified by a NGLMapCamera object, with a specific duration (1 second) and optional animation.

  14. Set Camera with Duration and Completion Handler: Moves the viewpoint of the map to a different location specified by a NGLMapCamera object, with a specific duration (1 second), optional animation, and a completion handler.

  15. Fly to Camera: Moves the viewpoint of the map to a different location specified by a NGLMapCamera object, using a transition animation that simulates powered flight.

  16. Fly to Camera with Duration: Moves the viewpoint of the map to a different location specified by a NGLMapCamera object, using a transition animation that simulates powered flight, with a specific duration (2 seconds) and optional completion handler.

  17. Fly to Camera with Duration and Peak Altitude: Moves the viewpoint of the map to a different location specified by a NGLMapCamera object, using a transition animation that simulates powered flight, with a specific duration (2 seconds), peak altitude (1000), and optional completion handler.

没找到你要找的内容?