Zoom w MKMapView programowo

głosy
23

Używam MKMapViewwewnątrz aplikacji iPhone. Po kliknięciu przycisku poziom zbliżenia musi wzrosnąć. To jest moje pierwsze podejście:

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

Jednak kod ten nie miał wpływu, ponieważ nie aktualizuje wartość longitudeDelta. Tak I dodaje ten wiersz:

zoomIn.span.longitudeDelta *= 0.5;

Teraz to działa, ale tylko czasami. latitudeDeltaI longitudeDeltanie zmieniają się w ten sam sposób, to znaczy, ich wartości nie są proporcjonalne. Każdy pomysł jak rozwiązać ten problem?

Utwórz 23/06/2009 o 11:37
źródło użytkownik
W innych językach...                            


9 odpowiedzi

głosy
27

Nie mam pojęcia, czy to jest właściwy sposób to zrobić, ale używam tego, aby przybliżać i oddalać.

        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];
    }
Odpowiedział 29/07/2009 o 14:58
źródło użytkownik

głosy
21

Tylko sprzątanie za odpowiedź 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];

}

Kod SWIFT:

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)
}
Odpowiedział 21/11/2013 o 19:43
źródło użytkownik

głosy
21

Tutaj jest łatwiejsze rozwiązanie:

MKUserLocation *userLocation = mapView.userLocation;
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (
      userLocation.location.coordinate, 50, 50);
[mapView setRegion:region animated:NO];
Odpowiedział 28/11/2012 o 18:40
źródło użytkownik

głosy
2

Wystarczy tłumaczone rozwiązanie dkardel do SWIFT:

@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)
}
Odpowiedział 31/03/2015 o 08:43
źródło użytkownik

głosy
2

Oto mój sposób, aby przesunąć mapę do punktu adnotacji i przybliżyć dość blisko niego. Można łatwo zmienić w linii zoomCGFloat 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];
}
Odpowiedział 01/04/2014 o 11:57
źródło użytkownik

głosy
1

mapView.setRegion Metoda ma problemu, gdy mapa jest obracana

Można powiększyć mapę przez mapView.camera.altitudenieruchomości, ale to nie jest animowana:

mapView.camera.altitude *= 1.05

Można utworzyć nowy obiekt kamery i ustawić ją z animacji:

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)
Odpowiedział 17/05/2017 o 12:33
źródło użytkownik

głosy
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];
    }
}
Odpowiedział 20/02/2015 o 13:56
źródło użytkownik

głosy
1

Używam podobny kod do Ciebie i wydaje się działać. Co może się dziać to, że trójkąt nie zmienia się na tyle, aby spowodować, że poziom zoom wzrośnie z jednego poziomu google powiększenia do następnego. To również zależy od początkowego stanu mapy, które mogłyby wyjaśnić, dlaczego jest przerywany - tak jak można ustawić mapę i poziom powiększenia, aby rozpocząć, zanim użytkownik naciśnie przycisk powiększenia?

Można również zajrzeć do sposobu regionThatFits która będzie regulować obszar podasz (nazwa pochodzi od pamięci, jak nie mam docs apple poręczny).

Odpowiedział 23/06/2009 o 13:16
źródło użytkownik

głosy
0

Swift 4,2

let location = mapView.userLocation
let region = MKCoordinateRegion(center: location.coordinate, span: MKCoordinateSpan(latitudeDelta: 50, longitudeDelta: 50))
mapView.setRegion(region, animated: true)
Odpowiedział 22/03/2019 o 12:02
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more