summaryrefslogtreecommitdiff
path: root/platform/ios/demo/Examples/Swift/RuntimeAnimateLineExample.swift
diff options
context:
space:
mode:
Diffstat (limited to 'platform/ios/demo/Examples/Swift/RuntimeAnimateLineExample.swift')
-rw-r--r--platform/ios/demo/Examples/Swift/RuntimeAnimateLineExample.swift162
1 files changed, 162 insertions, 0 deletions
diff --git a/platform/ios/demo/Examples/Swift/RuntimeAnimateLineExample.swift b/platform/ios/demo/Examples/Swift/RuntimeAnimateLineExample.swift
new file mode 100644
index 0000000000..46280bd891
--- /dev/null
+++ b/platform/ios/demo/Examples/Swift/RuntimeAnimateLineExample.swift
@@ -0,0 +1,162 @@
+import Mapbox
+
+@objc(RuntimeAnimateLineExample_Swift)
+
+class RuntimeAnimateLineExample_Swift: UIViewController, MGLMapViewDelegate {
+ var mapView: MGLMapView!
+ var timer: Timer?
+ var polylineSource: MGLShapeSource?
+ var currentIndex = 1
+ var allCoordinates: [CLLocationCoordinate2D]!
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ mapView = MGLMapView(frame: view.bounds)
+ mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
+
+ mapView.setCenter(
+ CLLocationCoordinate2D(latitude: 45.5076, longitude: -122.6736),
+ zoomLevel: 11,
+ animated: false)
+ view.addSubview(mapView)
+
+ mapView.delegate = self
+
+ allCoordinates = coordinates()
+ }
+
+ // Wait until the map is loaded before adding to the map.
+ func mapView(_ mapView: MGLMapView, didFinishLoading style: MGLStyle) {
+ addLayer(to: style)
+ animatePolyline()
+ }
+
+ func addLayer(to style: MGLStyle) {
+ // Add an empty MGLShapeSource, we’ll keep a reference to this and add points to this later.
+ let source = MGLShapeSource(identifier: "polyline", shape: nil, options: nil)
+ style.addSource(source)
+ polylineSource = source
+
+ // Add a layer to style our polyline.
+ let layer = MGLLineStyleLayer(identifier: "polyline", source: source)
+ layer.lineJoin = MGLStyleValue(rawValue: NSValue(mglLineJoin: .round))
+ layer.lineCap = MGLStyleValue(rawValue: NSValue(mglLineCap: .round))
+ layer.lineColor = MGLStyleValue(rawValue: UIColor.red)
+ layer.lineWidth = MGLStyleFunction(interpolationMode: .exponential,
+ cameraStops: [14: MGLConstantStyleValue<NSNumber>(rawValue: 5),
+ 18: MGLConstantStyleValue<NSNumber>(rawValue: 20)],
+ options: [.defaultValue : MGLConstantStyleValue<NSNumber>(rawValue: 1.5)])
+ style.addLayer(layer)
+ }
+
+ func animatePolyline() {
+ currentIndex = 1
+
+ // Start a timer that will simulate adding points to our polyline. This could also represent coordinates being added to our polyline from another source, such as a CLLocationManagerDelegate.
+ timer = Timer.scheduledTimer(timeInterval: 0.05, target: self, selector: #selector(tick), userInfo: nil, repeats: true)
+ }
+
+ func tick() {
+ if currentIndex > allCoordinates.count {
+ timer?.invalidate()
+ timer = nil
+ return
+ }
+
+ // Create a subarray of locations up to the current index.
+ let coordinates = Array(allCoordinates[0..<currentIndex])
+
+ // Update our MGLShapeSource with the current locations.
+ updatePolylineWithCoordinates(coordinates: coordinates)
+
+ currentIndex += 1
+ }
+
+ func updatePolylineWithCoordinates(coordinates: [CLLocationCoordinate2D]) {
+ var mutableCoordinates = coordinates
+
+ let polyline = MGLPolylineFeature(coordinates: &mutableCoordinates, count: UInt(mutableCoordinates.count))
+
+ // Updating the MGLShapeSource’s shape will have the map redraw our polyline with the current coordinates.
+ polylineSource?.shape = polyline
+ }
+
+ func coordinates() -> [CLLocationCoordinate2D] {
+ return [
+ (-122.63748, 45.52214),
+ (-122.64855, 45.52218),
+ (-122.6545, 45.52219),
+ (-122.65497, 45.52196),
+ (-122.65631, 45.52104),
+ (-122.6578, 45.51935),
+ (-122.65867, 45.51848),
+ (-122.65872, 45.51293),
+ (-122.66576, 45.51295),
+ (-122.66745, 45.51252),
+ (-122.66813, 45.51244),
+ (-122.67359, 45.51385),
+ (-122.67415, 45.51406),
+ (-122.67481, 45.51484),
+ (-122.676, 45.51532),
+ (-122.68106, 45.51668),
+ (-122.68503, 45.50934),
+ (-122.68546, 45.50858),
+ (-122.6852, 45.50783),
+ (-122.68424, 45.50714),
+ (-122.68433, 45.50585),
+ (-122.68429, 45.50521),
+ (-122.68456, 45.50445),
+ (-122.68538, 45.50371),
+ (-122.68653, 45.50311),
+ (-122.68731, 45.50292),
+ (-122.68742, 45.50253),
+ (-122.6867, 45.50239),
+ (-122.68545, 45.5026),
+ (-122.68407, 45.50294),
+ (-122.68357, 45.50271),
+ (-122.68236, 45.50055),
+ (-122.68233, 45.49994),
+ (-122.68267, 45.49955),
+ (-122.68257, 45.49919),
+ (-122.68376, 45.49842),
+ (-122.68428, 45.49821),
+ (-122.68573, 45.49798),
+ (-122.68923, 45.49805),
+ (-122.68926, 45.49857),
+ (-122.68814, 45.49911),
+ (-122.68865, 45.49921),
+ (-122.6897, 45.49905),
+ (-122.69346, 45.49917),
+ (-122.69404, 45.49902),
+ (-122.69438, 45.49796),
+ (-122.69504, 45.49697),
+ (-122.69624, 45.49661),
+ (-122.69781, 45.4955),
+ (-122.69803, 45.49517),
+ (-122.69711, 45.49508),
+ (-122.69688, 45.4948),
+ (-122.69744, 45.49368),
+ (-122.69702, 45.49311),
+ (-122.69665, 45.49294),
+ (-122.69788, 45.49212),
+ (-122.69771, 45.49264),
+ (-122.69835, 45.49332),
+ (-122.7007, 45.49334),
+ (-122.70167, 45.49358),
+ (-122.70215, 45.49401),
+ (-122.70229, 45.49439),
+ (-122.70185, 45.49566),
+ (-122.70215, 45.49635),
+ (-122.70346, 45.49674),
+ (-122.70517, 45.49758),
+ (-122.70614, 45.49736),
+ (-122.70663, 45.49736),
+ (-122.70807, 45.49767),
+ (-122.70807, 45.49798),
+ (-122.70717, 45.49798),
+ (-122.70713, 45.4984),
+ (-122.70774, 45.49893)
+ ].map({CLLocationCoordinate2D(latitude: $0.1, longitude: $0.0)})
+ }
+}