diff options
Diffstat (limited to 'platform/ios/demo/Examples/Swift/AnnotationViewExample.swift')
-rw-r--r-- | platform/ios/demo/Examples/Swift/AnnotationViewExample.swift | 95 |
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") + } +} |