2011-01-18 24 views
5

Sto zoomando un MKMapView per adattarlo alla regione di delimitazione di una serie di pin, tuttavia quando vengono visualizzati i pin ho notato che lo zoom potrebbe idealmente essere un po 'più stretto. La mia proposta di soluzione a questo è stato quello di rendere i delta regione leggermente più piccole:Leggero zoom su MKCoordinateRegion?

// SMALL ZOOM 
region.span.latitudeDelta = (upper.latitude - lower.latitude) * 0.9; 
region.span.longitudeDelta = (upper.longitude - lower.longitude) * 0.9; 

Tuttavia ho notato che le regolazioni fini non sembrano tradursi in un piccolo aumento di zoom, c'è una qualche forma di scattare sul zoom? Valori veramente piccoli funzionano, come quelli veramente grandi, ma la semplice regolazione della dimensione della regione di qualche percento non sembra funzionare con la vista che quasi sempre salta/scatta fino a lontano e taglia i miei pin.

EDIT:

test rapidi che mostrano i risultati di diversi fattori di scala sulla regione:

//                SCALE FACTOR 
//                 V 
region.span.latitudeDelta = (upper.latitude - lower.latitude) * 0.9; 
region.span.longitudeDelta = (upper.longitude - lower.longitude) * 0.9; 

Ecco i risultati:

  • regione x0.5 troppo piccole, alcune annotazioni fuori dallo schermo
  • x0.6 Come usare 1.0
  • x0.7 Come utilizzando 1,0
  • x0.8 Uguale usando 1.0
  • x0.9 stesso che utilizzare 1,0
  • x1.0 forma originale
  • regione X1.1 troppo grande, annotazioni troppo piccolo sullo schermo

Il mio punto è che le regolazioni molto piccole (ad es Da 0,6 a 0,9) non sembrano fare alcuna differenza.

+0

L'obiettivo esegue automaticamente lo zoom e la panoramica per adattare le annotazioni o manualmente? –

+0

Sto posizionando le annotazioni sulla mappa e quindi usando MKCoordinateRegion region = MKCoordinateRegionMake (locationCenter, locationSpan); per adattarsi quindi alla vista. Quello che stavo cercando di fare era regolare leggermente la posizioneSpan per ottenere uno zoom leggermente più stretto (cioè del 5%). – fuzzygoat

risposta

6

regolazioni più piccoli potranno mai fare il cambiamento livello di zoom mapview. Quando si passa una regione, mapview decide su quale livello di zoom utilizzare per adattarsi al meglio. Non userà mai un livello "intermedio". Il motivo è che i livelli di zoom "intermedi" sembrano confusi. Gli dai la regione che vuoi mostrare e fa un livello di zoom che include l'intera regione. Fornire la regione desiderata a regionThatFits: dovrebbe restituire il livello che utilizza.

Se si esegue lo zoom della mappa con un pizzico, è possibile ottenere un livello tra due livelli di zoom, ma se si tocca due volte (per ingrandire) o si tocca due dita (per ridurre) si vedrà solo i livelli di zoom "standard".

Sto parlando di livelli di zoom qui, ma in realtà non esistono in iOS nello stesso modo in cui esistono in Google Maps. Solo le regioni esistono fino all'impostazione della mappa a un certo livello.

Con il tuo problema di trovare la soluzione migliore per i pin, ho scoperto che qualcosa è cambiato in iOS 4 e il codice che avevo usato per adattarsi ai pin ha dato improvvisamente troppo spazio. Ho diviso i delta per 3 e ha funzionato di nuovo. Potresti voler avvolgere questo condizionale per scegliere come target solo iOS 4.

region.span.longitudeDelta = (maxCoord.longitude - minCoord.longitude)/3.0; 
region.span.latitudeDelta = (maxCoord.latitude - minCoord.latitude)/3.0; 

Guardando il codice, si utilizza * 0.9 per ottenere la stessa identica cosa.

Una delle cose strane che ho trovato era che il valore restituito da regionThatFits: non era sempre la regione che l'impostazione mapview ha finito. Potrebbe essere un bug, ma è stato lì fin da iOS 4.0. Puoi testarlo da solo registrando lo MKCoordinateRegion da regionThatFits: e confrontandolo con la regione della mappa dopo lo zoom. Mi sembra di ricordare che è arrivato nei forum degli sviluppatori Apple.

+0

Per espandere la risposta di nevan, i riquadri delle mappe sono pre-renderizzati in una serie di risoluzioni diverse che necessariamente hanno passi discreti e come una questione pratica hanno spesso passaggi abbastanza grandi (l'archiviazione è economica, ma questo è * l'intero pianeta * noi " sto parlando :) –

+0

È vero, avrei dovuto dirlo. Penso che i passaggi siano tutti solo un dimezzamento di larghezza (per semplificare la matematica). Pertanto, l'ingrandimento di una tessera 512x512 utilizza 4 tessere 512x512 per mostrare la stessa area. Questo post ha una delle migliori spiegazioni che abbia mai letto: http://troybrant.net/blog/2010/01/mkmapview-and-zoom-levels-a-visual-guide/ –

+0

Molto apprezzato, che ha perfettamente senso . Metà della mia ragione per chiedere era solo di scoprire "perché". Dividendo i delta di 3.0 zoom molto lontano per me, avrò un gioco e vedrò quello che posso inventare, ma almeno ora sono sulla strada giusta. – fuzzygoat

4

Ho trovato questo metodo estremamente utile. Tutto quello che devi fare è chiamarlo e passare il tuo MKMapView come argomento, e determinerà il miglior livello di zoom per adattarsi a tutte le tue annotazioni. La "tenuta" può essere regolata modificando il moltiplicatore costante sulle linee commentate (attualmente 1.1).

What's the best way to zoom out and fit all annotations in MapKit

- (void)zoomToFitMapAnnotations:(MKMapView *)mapView 
{ 
    if ([mapView.annotations count] == 0) 
     return; 

    CLLocationCoordinate2D topLeftCoord; 
    topLeftCoord.latitude = -90; 
    topLeftCoord.longitude = 180; 

    CLLocationCoordinate2D bottomRightCoord; 
    bottomRightCoord.latitude = 90; 
    bottomRightCoord.longitude = -180; 

    for (MapAnnotation *annotation in mapView.annotations) 
    { 
     topLeftCoord.longitude = fmin(topLeftCoord.longitude, annotation.coordinate.longitude); 
     topLeftCoord.latitude = fmax(topLeftCoord.latitude, annotation.coordinate.latitude); 

     bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, annotation.coordinate.longitude); 
     bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, annotation.coordinate.latitude); 
    } 

    MKCoordinateRegion region; 
    region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5; 
    region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5; 
    region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1; // Add a little extra space on the sides 
    region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1; // Add a little extra space on the sides 

    region = [mapView regionThatFits:region]; 
    [mapView setRegion:region animated:YES]; 
} 
+0

Ciao Evan, questo è praticamente quello che ho fatto nella mia routine. Ho perso "regionThatFits" ma l'ho appena aggiunto e sembra non fare alcuna differenza. Il mio problema è che l'uso di piccoli moltiplicatori (per stringere la regione) come x0.6, x0.7, x0.8, x0.9, che dovrebbero tutti ridurre la regione attorno al suo centro, producono tutti lo stesso risultato. x1.0 è troppo lontano, x0.9 è troppo lontano, non sembra essere un mezzo felice. – fuzzygoat

+0

Hai provato a regolare il moltiplicatore 1.1x sulle righe commentate? Questo dovrebbe produrre un piccolo effetto zoom. –

+0

Il moltiplicatore 1.1x è quello che ho cambiato. 1.1 sta facendo un pullback, rendendo la regione più grande e dando più spazio ai lati. Quello che voglio è un pushin/zoom, rendendo la regione più piccola in modo che la regione riempia lo schermo più stretto. – fuzzygoat