2016-12-01 2 views
0

MGLAnnotationView als Sourceview zu setzen, was ich tun möchte, ist mit der Anmerkung als Quelle Ansicht/Anker einen popover präsentierenWie für popover

Delegatfunktion didSelect AnnotationView Durch die Verwendung sollte ich in der Lage sein, dies zu erreichen, , aber es scheint überhaupt nicht zu laufen. Für jetzt bin ich nur didSelect Anmerkung meine popover über präsentiert und haben die Sourceview auf Navigationsleiste, nur für sie irgendwo zeigt ...

FYI: Ich habe das MapBox SDK in das Projekt umgesetzt . Ich habe keine Probleme, die gleiche Aufgabe mit MapKit durchzuführen.

Hat jemand eine Idee, was ich tun kann, um dies zu erreichen?

Code-Schnipsel unter:

import UIKit 
import Mapbox 

class ViewController: UIViewController, MGLMapViewDelegate, UIPopoverPresentationControllerDelegate { 

@IBOutlet var theMap: MGLMapView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    theMap.delegate = self 

    let point = MGLPointAnnotation() 
    point.coordinate = CLLocationCoordinate2D(latitude: 55.6, longitude: 13.0) 
    point.title = "Some place" 
    point.subtitle = "Malmö, Sweden" 
    theMap.addAnnotation(point) 
} 

func mapView(_ mapView: MGLMapView, didSelect annotationView: MGLAnnotationView) { 
    print("annotation view: ", annotationView) 
    // this method doesn't seem to get called at all... 
    // but ideally this is the place to present the popover. 
} 

func mapView(_ mapView: MGLMapView, didSelect annotation: MGLAnnotation) { 
    print("annotation: ", annotation) 
    // present the popover 
    presentPopover() 
} 

func presentPopover(){ 
    let popover = storyboard?.instantiateViewController(withIdentifier: "MyCalloutVC") as! MyCallout 

    popover.modalPresentationStyle = UIModalPresentationStyle.popover 
    popover.popoverPresentationController?.backgroundColor = UIColor.white 
    popover.popoverPresentationController?.delegate = self 

    // I would like to set the source anchor to the selected annotation view. 
    popover.popoverPresentationController?.sourceView = UINavigationBar() // set to nav bar for now... 
    popover.popoverPresentationController?.permittedArrowDirections = .any 
    // popover size set in MyCallout 
    self.present(popover, animated: true) 
    } 
} 

Antwort

0

Die Funktion nicht aufgerufen werden kann, da es keine Anmerkungsansicht ist, die ausgewählt werden können. Dies bedeutet, dass Sie einfach eine Punktannotation und keine Annotationsansicht hinzufügen. Dazu müssen Sie folgendes tun: Wenn Sie die Annotation hinzufügen, wird die func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {} aufgerufen, wo Sie eine Annotation-Ansicht definieren und zurückgeben können. Dann wird die gewählte Funktion aufgerufen. Sehen Sie sich den Beispielcode an: https://www.mapbox.com/ios-sdk/examples/annotation-views/

import Mapbox 

// Example view controller 
class ViewController: 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") 
    } 
} 
+0

Vielen Dank @ppoh71 für Ihre erklärende Antwort, richtige Sachen! Ich bin jetzt auf dem besten Weg. –