2009-06-23 20 views
23

Sto utilizzando uno MKMapView all'interno di un'app per iPhone. Quando clicco su un pulsante il livello di zoom deve aumentare. Questo è il mio primo approccio:Ingrandire un MKMapView a livello di programmazione

MKCoordinateRegion zoomIn = mapView.region; 
zoomIn.span.latitudeDelta *= 0.5; 
[mapView setRegion:zoomIn animated:YES]; 

Tuttavia, questo codice non ha avuto effetto, dal momento che non ho aggiornato il valore longitudeDelta. Così ho aggiunto questa riga:

zoomIn.span.longitudeDelta *= 0.5; 

Ora funziona, ma solo qualche volta. I numeri latitudeDelta e longitudeDelta non cambiano allo stesso modo, voglio dire, i loro valori non sono proporzionali. Qualche idea su come risolvere questo?

risposta

1

Uso un codice simile al tuo e sembra funzionare. Quello che potrebbe accadere è che il tuo delta non sta cambiando abbastanza da far aumentare il livello di zoom da un livello di zoom di google a quello successivo. Ciò dipenderebbe anche dallo stato iniziale della mappa, che potrebbe spiegare perché è intermittente, quindi come impostare la mappa e il livello di zoom in alto per iniziare, prima che l'utente preme il pulsante dello zoom?

Si può anche cercare nella regione il metodo Fits che aggiusterà la regione che fornisci (il nome viene dalla memoria perché non ho a portata di mano i documenti apple).

27

Non ho idea se questo è il modo giusto per farlo, ma lo sto usando per ingrandire e rimpicciolire.

 case 0: { // Zoom In 
     //NSLog(@"Zoom - IN"); 
     MKCoordinateRegion region; 
     //Set Zoom level using Span 
     MKCoordinateSpan span; 
     region.center=mapView.region.center; 

     span.latitudeDelta=mapView.region.span.latitudeDelta /2.0002; 
     span.longitudeDelta=mapView.region.span.longitudeDelta /2.0002; 
     region.span=span; 
     [mapView setRegion:region animated:TRUE]; 
    } 
     break; 

    // Zoom Out 
    case 2: { 
     //NSLog(@"Zoom - OUT"); 
     MKCoordinateRegion region; 
     //Set Zoom level using Span 
     MKCoordinateSpan span; 
     region.center=mapView.region.center; 
     span.latitudeDelta=mapView.region.span.latitudeDelta *2; 
     span.longitudeDelta=mapView.region.span.longitudeDelta *2; 
     region.span=span; 
     [mapView setRegion:region animated:TRUE]; 
    } 
+0

Mi aiuta entrava, grazie bro – user366584

+0

Questo funziona bene, ma quando si preme continuamente il pulsante Zoom Out mi darà eccezione dopo un certo livello . Come posso impedirlo? –

+0

Freddo. Qual è il punto di divisione per 2.0002 anziché 2? Solo curioso :) – dustinrwh

21

Ecco una soluzione più semplice:

MKUserLocation *userLocation = mapView.userLocation; 
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (
     userLocation.location.coordinate, 50, 50); 
[mapView setRegion:region animated:NO]; 
21

Basta ripulire la risposta di dkdarel

// delta is the zoom factor 
// 2 will zoom out x2 
// .5 will zoom in by x2 
- (void)zoomMap:(MKMapView*)mapView byDelta:(float) delta { 

    MKCoordinateRegion region = mapView.region; 
    MKCoordinateSpan span = mapView.region.span; 
    span.latitudeDelta*=delta; 
    span.longitudeDelta*=delta; 
    region.span=span; 
    [mapView setRegion:region animated:YES]; 

} 

Swift Code:

func zoomMap(byFactor delta: Double) { 
    var region: MKCoordinateRegion = self.mapView.region 
    var span: MKCoordinateSpan = mapView.region.span 
    span.latitudeDelta *= delta 
    span.longitudeDelta *= delta 
    region.span = span 
    mapView.setRegion(region, animated: true) 
} 
+1

Ciò funziona perfettamente per me. – Sadurnias

+0

Penso che questo sarebbe un corretto Codice SWIFT func zoomRegion (regione: inout MKCoordinateRegion, byFactor delta: Doppio) {var arco: MKCoordinateSpan = region.span span.latitudeDelta * = delta span.longitudeDelta * = delta region.span = span } –

2

Qui è il mio modo di sposta la mappa nel punto di annotazione e ingrandisci abbastanza vicino ad essa. Si può facilmente cambiare lo zoom in linea CGFloat newLatDelta = 0.06f;

- (void)moveMapToAnnotation:(MKPointAnnotation*)annotation 
{ 
    CGFloat fractionLatLon = map.region.span.latitudeDelta/map.region.span.longitudeDelta; 
    CGFloat newLatDelta = 0.06f; 
    CGFloat newLonDelta = newLatDelta * fractionLatLon; 
    MKCoordinateRegion region = MKCoordinateRegionMake(annotation.coordinate, MKCoordinateSpanMake(newLatDelta, newLonDelta)); 
    [map setRegion:region animated:YES]; 
} 
+0

Questo è esattamente quello che stavo cercando .. Thanx bro –

1
- (IBAction)btnZoomInPressed 
{ 
    MKCoordinateRegion region; 
    MKCoordinateSpan span; 
    region.center.latitude = lati; 
    region.center.longitude = longi; 
    span.latitudeDelta=viewMapSingleVenue.region.span.latitudeDelta /2.0002; 
    span.longitudeDelta=viewMapSingleVenue.region.span.longitudeDelta /2.0002; 
    region.span=span; 
    [viewMapSingleVenue setRegion:region animated:TRUE]; 
} 

- (IBAction)btnZoomOutPressed 
{ 
    MKCoordinateRegion region; 
    MKCoordinateSpan span; 
    region.center.latitude = lati; 
    region.center.longitude = longi; 
    span.latitudeDelta=viewMapSingleVenue.region.span.latitudeDelta *2; 
    span.longitudeDelta=viewMapSingleVenue.region.span.longitudeDelta *2; 
    if(span.latitudeDelta < 200) 
    { 
    region.span=span; 
    [viewMapSingleVenue setRegion:region animated:TRUE]; 
    } 
} 
2

soluzione dkardel Proprio tradotto in rapida:

@IBAction func zoomOutButtonClicked(sender: UIButton) { 
    let span = MKCoordinateSpan(latitudeDelta: mapView.region.span.latitudeDelta*2, longitudeDelta: mapView.region.span.longitudeDelta*2) 
    let region = MKCoordinateRegion(center: mapView.region.center, span: span) 

    mapView.setRegion(region, animated: true) 
} 

@IBAction func zoomInButtonClicked(sender: UIButton) { 
    let span = MKCoordinateSpan(latitudeDelta: mapView.region.span.latitudeDelta/2, longitudeDelta: mapView.region.span.longitudeDelta/2) 
    let region = MKCoordinateRegion(center: mapView.region.center, span: span) 

    mapView.setRegion(region, animated: true) 
} 
1

mapView.setRegion metodo ha problema quando il mappa viene ruotata

È possibile ingrandire la mappa via mapView.camera.altitude proprietà, ma non è animata:

mapView.camera.altitude *= 1.05 

È possibile creare nuovo oggetto fotocamera e impostarla con l'animazione:

let currentCamera = mapView.camera 
let newCamera: MKMapCamera 
if #available(iOS 9.0, *) { 
    newCamera = MKMapCamera(lookingAtCenter: currentCamera.centerCoordinate, fromDistance: currentCamera.altitude * 2, pitch: currentCamera.pitch, heading: currentCamera.heading) 
} else { 
    newCamera = MKMapCamera() 
    newCamera.centerCoordinate = currentCamera.centerCoordinate 
    newCamera.heading = currentCamera.heading 
    newCamera.altitude = currentCamera.altitude * 2 
    newCamera.pitch = currentCamera.pitch 
} 

mapView.setCamera(newCamera, animated: true) 
Problemi correlati