summaryrefslogtreecommitdiff
path: root/platform/ios/demo/Examples/Swift/AnnotationViewExample.swift
diff options
context:
space:
mode:
Diffstat (limited to 'platform/ios/demo/Examples/Swift/AnnotationViewExample.swift')
-rw-r--r--platform/ios/demo/Examples/Swift/AnnotationViewExample.swift95
1 files changed, 95 insertions, 0 deletions
diff --git a/platform/ios/demo/Examples/Swift/AnnotationViewExample.swift b/platform/ios/demo/Examples/Swift/AnnotationViewExample.swift
new file mode 100644
index 0000000000..d818387861
--- /dev/null
+++ b/platform/ios/demo/Examples/Swift/AnnotationViewExample.swift
@@ -0,0 +1,95 @@
+import Mapbox
+
+@objc(AnnotationViewExample_Swift)
+
+// Example view controller
+class AnnotationViewExample_Swift: UIViewController, MGLMapViewDelegate {
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ let mapView = MGLMapView(frame: view.bounds)
+ mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
+ mapView.styleURL = MGLStyle.darkStyleURL(withVersion: 9)
+ mapView.tintColor = .lightGray
+ mapView.centerCoordinate = CLLocationCoordinate2D(latitude: 0, longitude: 66)
+ mapView.zoomLevel = 2
+ mapView.delegate = self
+ view.addSubview(mapView)
+
+ // Specify coordinates for our annotations.
+ let coordinates = [
+ CLLocationCoordinate2D(latitude: 0, longitude: 33),
+ CLLocationCoordinate2D(latitude: 0, longitude: 66),
+ CLLocationCoordinate2D(latitude: 0, longitude: 99),
+ ]
+
+ // Fill an array with point annotations and add it to the map.
+ var pointAnnotations = [MGLPointAnnotation]()
+ for coordinate in coordinates {
+ let point = MGLPointAnnotation()
+ point.coordinate = coordinate
+ point.title = "\(coordinate.latitude), \(coordinate.longitude)"
+ pointAnnotations.append(point)
+ }
+
+ mapView.addAnnotations(pointAnnotations)
+ }
+
+ // MARK: - MGLMapViewDelegate methods
+
+ // This delegate method is where you tell the map to load a view for a specific annotation. To load a static MGLAnnotationImage, you would use `-mapView:imageForAnnotation:`.
+ func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
+ // This example is only concerned with point annotations.
+ guard annotation is MGLPointAnnotation else {
+ return nil
+ }
+
+ // Use the point annotation’s longitude value (as a string) as the reuse identifier for its view.
+ let reuseIdentifier = "\(annotation.coordinate.longitude)"
+
+ // For better performance, always try to reuse existing annotations.
+ var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier)
+
+ // If there’s no reusable annotation view available, initialize a new one.
+ if annotationView == nil {
+ annotationView = CustomAnnotationView(reuseIdentifier: reuseIdentifier)
+ annotationView!.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
+
+ // Set the annotation view’s background color to a value determined by its longitude.
+ let hue = CGFloat(annotation.coordinate.longitude) / 100
+ annotationView!.backgroundColor = UIColor(hue: hue, saturation: 0.5, brightness: 1, alpha: 1)
+ }
+
+ return annotationView
+ }
+
+ func mapView(_ mapView: MGLMapView, annotationCanShowCallout annotation: MGLAnnotation) -> Bool {
+ return true
+ }
+}
+
+//
+// MGLAnnotationView subclass
+class CustomAnnotationView: MGLAnnotationView {
+ override func layoutSubviews() {
+ super.layoutSubviews()
+
+ // Force the annotation view to maintain a constant size when the map is tilted.
+ scalesWithViewingDistance = false
+
+ // Use CALayer’s corner radius to turn this view into a circle.
+ layer.cornerRadius = frame.width / 2
+ layer.borderWidth = 2
+ layer.borderColor = UIColor.white.cgColor
+ }
+
+ override func setSelected(_ selected: Bool, animated: Bool) {
+ super.setSelected(selected, animated: animated)
+
+ // Animate the border width in/out, creating an iris effect.
+ let animation = CABasicAnimation(keyPath: "borderWidth")
+ animation.duration = 0.1
+ layer.borderWidth = selected ? frame.width / 4 : 2
+ layer.add(animation, forKey: "borderWidth")
+ }
+}