2015-01-26 11 views
7

Ho due annotazioni da visualizzare sulla mappa, ma non riesco a impostare maprect per visualizzarle tutte sullo schermo senza che gli utenti debbano effettuare lo zoom indietro.Impossibile impostare maprect per mostrare tutte le annotazioni

Ho provato con showAnnotations ma senza fortuna. Qualcuno è stato in grado di farlo in Swift e Xcode 6.1.1?

Ecco il mio codice:

class ViewController: UIViewController, MKMapViewDelegate { 


    @IBOutlet var map: MKMapView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     var mapView = map 
     // 1 
     let point1 = CLLocationCoordinate2D(latitude: 38.915565, longitude: -77.093524) 
     let point2 = CLLocationCoordinate2D(latitude: 38.890693, longitude: -76.933318) 

     //2 
     let annotation = MKPointAnnotation() 
     annotation.setCoordinate(point1) 
     annotation.title = "point1" 
     map.addAnnotation(annotation) 

     let annotation2 = MKPointAnnotation() 
     annotation2.setCoordinate(point2) 
     annotation2.title = "point2" 
     map.addAnnotation(annotation2) 

     //3 
     // option1: set maprect to cover all annotations, doesn't work 
     var points = [annotation, annotation2] 
     var rect = MKMapRectNull 
     for p in points { 
      let k = MKMapPointForCoordinate(p.coordinate) 
      rect = MKMapRectUnion(rect, MKMapRectMake(k.x, k.y, 0.1, 0.1)) 
      println("result: x = \(rect.origin.x) y = \(rect.origin.y)") 
     } 

     map.setVisibleMapRect(rect, animated: true) 

     // option 2: using showAnnotations, doesn't work 
     //map.showAnnotations(points, animated: true) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    } 

Questo è quello che ho ottenuto al momento: enter image description here

Questo è quello che mi aspettavo di vedere: enter image description here

Grazie per il vostro aiuto.

+0

Puoi spiegare cosa intendi esattamente dicendo "showAnnotations" "non funziona"? Che succede? Per 'setVisibleMapRect', potresti voler applicare un ** riquadro ** (vedi http://stackoverflow.com/a/22070026/467105 per un esempio). Inoltre, hai implementato 'viewForAnnotation' che mostra un'immagine personalizzata per le annotazioni ma nello screenshot che ti aspetti, mostra i pin rossi predefiniti. Perché ti aspetti i pin rossi di default? – Anna

+0

Anna, cosa intendevo per "non funziona" per showAnnotations è che non mostrava tutti i pin come nella schermata prevista. – tala9999

+0

Il codice con showAnnotations sembra corretto. Se preferisci setVisibleMapRect, aggiungi un riquadro. _Commenta completamente il metodo viewForAnnotation durante il test dello zoom. Una volta che lo zoom è stato risolto, quindi correggere il problema con viewForAnnotation._ Se non vengono visualizzati pin, assicurarsi che venga chiamato viewForAnnotation (assicurarsi che sia impostato il delegato della mappa, assicurarsi che il file di immagine esista). – Anna

risposta

18

Ho finalmente scoperto perché i pin delle annotazioni non erano stati visualizzati nella regione visibile dello schermo. Penso che il framework MapKit si comporta in modo leggermente diverso rispetto alle versioni precedenti. Da quando uso AutoLayout permettere la mappa di espandersi per l'intero schermo per tutti i dispositivi (iPhone, iPad), setVisibleMapRect o mapView.showAnnotations della mappa, occorre fare ricorso a mapViewDidFinishLoadingMap, non in viewDidLoad del controller della vista

Ad esempio :

func mapViewDidFinishLoadingMap(_ mapView: MKMapView) { 
    // this is where visible maprect should be set 
    mapView.showAnnotations(mapView.annotations, animated: true) 
} 
3

ho avuto questo stesso problema quando ho chiamato

viewDidLoad() { 
    mapView.showAnnotations(myAnnotations, animated: false) 
} 

Tuttavia, spostare la chiamata a viewDidLayoutSubviews() sembra anche per risolvere il problema (non che isInitialLoad è inizializzato a true in viewDidLo anno Domini).

viewDidLayoutSubviews() { 
    if isInitialLoad { 
     mapView.showAnnotations(myAnnotations, animated: false) 
     isInitialLoad = false 
    } 
} 

La differenza (penso che sia un vantaggio) di mettere la chiamata in viewDidLayoutSubviews è che la mappa non è ancora effettivamente visualizzato, quindi il display iniziale è quella zona delimitata dalle annotazioni. Tuttavia, sembra che venga chiamato ogni volta che la mappa viene ingrandita, quindi è necessario essere sicuri di chiamarla solo la prima volta.

+0

Sì, questo è un buon approccio. – tala9999

2

Per me utilizzare le annotazioni visualizzate dopo il completamento del caricamento della mappa non ha funzionato.

func mapViewDidFinishLoadingMap(mapView: MKMapView!) { 
// this is where visible maprect should be set 
mapView.showAnnotations(mapView.annotations, animated: true) 
} 

Oltre a mostrare l'annotazione, ho bisogno di calcolare polilinee per collegare le annotazioni e cartina loading finito è stato attivato troppo presto.

Invece ho provato mapViewDidFinishRenderingMap e ha funzionato perfettamente bene. Vedere il seguente esempio:

//MARK: - Show all objects after adding them on the map 
func mapViewDidFinishRenderingMap(mapView: MKMapView, fullyRendered: Bool) { 
    mapView.showAnnotations(mapStages, animated: true) 
} 
0

Si può provare questo. Ho creato un'estensione per mostrare tutte le annotazioni usando del codice da qui e li in swift 2.3. Questo non mostrerà tutte le annotazioni se non possono essere mostrate anche al massimo livello di zoom.

import MapKit 

extension MKMapView { 
    func fitAllAnnotations() { 
     var zoomRect = MKMapRectNull; 
     for annotation in annotations { 
      let annotationPoint = MKMapPointForCoordinate(annotation.coordinate) 
      let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1); 
      zoomRect = MKMapRectUnion(zoomRect, pointRect); 
     } 
     setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(20, 20, 20, 20), animated: true) 
    } 
}