2012-11-26 6 views
23

Ho un array, allCollections, che contiene gli array di CLLoc creati a livello di codice che l'utente ha registrato tramite la mia app iOS. Ciascun sotto-array in tutte le raccolte contiene tutti i punti di posizione in un viaggio.Zoom MKMapView per adattarsi ai punti polilinea

Disegna MKPolylines fuori dalle CLLocations negli array di allCollections per rappresentare quei viaggi su un MKMapView. La mia domanda è questa: con le polilinee aggiunte alla mappa, come faccio a fare lo zoom e il centraggio della mappa al livello di programmazione per visualizzarle tutte?

+0

Forse la mia risposta di aiuto? – Craig

risposta

7

È possibile eseguire il ciclo di tutte le coordinate CLLocations registrando le coordinate max/min e utilizzarle per impostare una visualizzazione rect come su questa domanda iOS MKMapView zoom to show all markers.

Oppure si potrebbe passare attraverso ciascuno dei vostri sovrapposizioni e ottenere la loro boundingMapRect quindi utilizzare MKMapRectUnion (http://developer.apple.com/library/ios/documentation/MapKit/Reference/MapKitFunctionsReference/Reference/reference.html#//apple_ref/c/func/MKMapRectUnion) per combinare tutti fino ad avere uno MKMapRect che li copre e l'uso che per impostare la vista.

[mapView setVisibleMapRect:zoomRect animated:YES] 

Questa domanda mostra un semplice ciclo che unisce le maprects nei sindacati come ho suggerito: MKMapRect zooms too much

+0

Ti devo una birra per quello :) – Devarshi

14
-(void)zoomToPolyLine: (MKMapView*)map polyLine: (MKPolyline*)polyLine 
animated (BOOL)animated 
{ 
MKPolygon* polygon = 
    [MKPolygon polygonWithPoints:polyLine.points count:polyLine.pointCount]; 

[map setRegion:MKCoordinateRegionForMapRect([polygon boundingMapRect]) 
    animated:animated]; 
} 
+2

Non è necessario creare un MKPolygon come MKPolyline già implementare boundingMapRect – foOg

+0

come stai assegnando la fence a CLLocation ?? significa in goefencing come si alloca quella CLregion invece della regione circolare ??? – magid

59
-(void)zoomToPolyLine: (MKMapView*)map polyline: (MKPolyline*)polyline animated: (BOOL)animated 
{ 
    [map setVisibleMapRect:[polyline boundingMapRect] edgePadding:UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0) animated:animated]; 
} 
+2

Una piccola spiegazione con il codice è buona. –

+1

@BradKoch Questa soluzione utilizza 'boundingMapRect' per definire un rettangolo che racchiuda la sovrapposizione polilinea. Imposta quindi l'area di zoom della mappa su quel rettangolo con 'setVisibleMapRect' prendendo in considerazione i valori di padding regolabili con' edgePadding'. Ho trovato questa soluzione la più utile, dal momento che risolve il problema in modo efficiente con poche righe di codice e consente anche di modificare l'area di visualizzazione della mappa tramite inset. – sheepgobeep

+2

Questo funziona per me. Ma a quanto pare questo imposta il fattore di zoom su ** riempire ** lo schermo, invece di ** fit **. Puoi pensare ad una soluzione per quello –

7

in rapida:

if let first = mapView.overlays.first { 
    let rect = mapView.overlays.reduce(first.boundingMapRect, combine: {MKMapRectUnion($0, $1.boundingMapRect)}) 
    mapView.setVisibleMapRect(rect, edgePadding: UIEdgeInsets(top: 50.0, left: 50.0, bottom: 50.0, right: 50.0), animated: true) 
} 

questo zoom/pan per adattarsi tutti gli overlay con un piccolo buffer

4

Swift 3 versione del codice garafajon eccellente

if let first = self.mapView.overlays.first { 
     let rect = self.mapView.overlays.reduce(first.boundingMapRect, {MKMapRectUnion($0, $1.boundingMapRect)}) 
     self.mapView.setVisibleMapRect(rect, edgePadding: UIEdgeInsets(top: 50.0, left: 50.0, bottom: 50.0, right: 50.0), animated: true) 
    } 
0

@Fundtimer puntò modo giusto, unica cosa è che imbottitura deve essere regolato secondo le esigenze visive, in questo modo sosterrà tutte le altre sovrapposizioni e seguenti è la soluzione generica per tutte le sovrapposizioni.

-(void)zoomIntoExistingMapObjectForAnnot:(CustomMapAnnotation *)annot 
{ 
    id overlay = annot.shape;//I have overlay property in custom annotation class. 
    [_mapView setVisibleMapRect:[overlay boundingMapRect] edgePadding:UIEdgeInsetsMake(150.0, 150.0, 150.0, 150.0) animated:YES]; 
} 
0

Swift 4/versione leggermente modificata della risposta del programmatore.

func setVisibleMapArea(polyline: MKPolyline, edgeInsets: UIEdgeInsets, animated: Bool = false) { 
    mapView.setVisibleMapRect(polyline.boundingMapRect, edgePadding: edgeInsets, animated: animated) 
} 

Chiamando il sopra utilizzando polilinea di un percorso e lasciando il default di non animati, e l'aggiunta di piccoli inserti di bordo di 10 in tutto:

setVisibleMapArea(polyline: route.polyline, edgeInsets: UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0))