2011-10-05 14 views
9

estoy escribiendo el siguiente código,Cómo detectar que MKMapView está disminuyendo/acercándose?

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated { 
    mapRegion = mapView.region; //MKCoordinateRegion myRegion in .h 
} 

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated { 

     MKCoordinateRegion newRegion = mapView.region; 

    if (mapRegion.span.latitudeDelta != newRegion.span.latitudeDelta || 
     mapRegion.span.longitudeDelta != newRegion.span.longitudeDelta){ 

     NSLog(@"The zoom has changed");   
    } 
} 

que quiero hacer alguna operación cuando el usuario ya sea zoom-in o zoom de alejamiento del MKMapView, ¿qué debería hacer, pero aplicando el código anterior, si la condición se ejecutará ¿el uso no ampliará/alejará pero solo cambiará el mapa?

Respuesta

22

Crear MKMapView+ZoomLevel.h como

#import <MapKit/MapKit.h> 

@interface MKMapView (ZoomLevel) 

- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate 
        zoomLevel:(double)zoomLevel 
        animated:(BOOL)animated; 

@end 

Crear MKMapView+ZoomLevel.m como

#import "MKMapView+ZoomLevel.h" 

#define MERCATOR_OFFSET 268435456 
#define MERCATOR_RADIUS 85445659.44705395 

@implementation MKMapView (ZoomLevel) 

#pragma mark - 
#pragma mark Map conversion methods 

- (double)longitudeToPixelSpaceX:(double)longitude 
{ 
    return round(MERCATOR_OFFSET + MERCATOR_RADIUS * longitude * M_PI/180.0); 
} 

- (double)latitudeToPixelSpaceY:(double)latitude 
{ 
    return round(MERCATOR_OFFSET - MERCATOR_RADIUS * logf((1 + sinf(latitude * M_PI/180.0))/(1 - sinf(latitude * M_PI/180.0)))/2.0); 
} 

- (double)pixelSpaceXToLongitude:(double)pixelX 
{ 
    return ((round(pixelX) - MERCATOR_OFFSET)/MERCATOR_RADIUS) * 180.0/M_PI; 
} 

- (double)pixelSpaceYToLatitude:(double)pixelY 
{ 
    return (M_PI/2.0 - 2.0 * atan(exp((round(pixelY) - MERCATOR_OFFSET)/MERCATOR_RADIUS))) * 180.0/M_PI; 
} 

#pragma mark - 
#pragma mark Helper methods 

- (MKCoordinateSpan)coordinateSpanWithMapView:(MKMapView *)mapView 
          centerCoordinate:(CLLocationCoordinate2D)centerCoordinate 
           andZoomLevel:(double)zoomLevel 
{ 
    NSLog(@"in custom zoomlevel-->%f",zoomLevel); 
    // convert center coordiate to pixel space 
    double centerPixelX = [self longitudeToPixelSpaceX:centerCoordinate.longitude]; 
    double centerPixelY = [self latitudeToPixelSpaceY:centerCoordinate.latitude]; 

    // determine the scale value from the zoom level 
    double zoomExponent = 20.0 - zoomLevel; 
    double zoomScale = pow(2, zoomExponent); 

    // scale the map’s size in pixel space 
    CGSize mapSizeInPixels = mapView.bounds.size; 
    double scaledMapWidth = mapSizeInPixels.width * zoomScale; 
    double scaledMapHeight = mapSizeInPixels.height * zoomScale; 

    // figure out the position of the top-left pixel 
    double topLeftPixelX = centerPixelX - (scaledMapWidth/2); 
    double topLeftPixelY = centerPixelY - (scaledMapHeight/2); 

    // find delta between left and right longitudes 
    CLLocationDegrees minLng = [self pixelSpaceXToLongitude:topLeftPixelX]; 
    CLLocationDegrees maxLng = [self pixelSpaceXToLongitude:topLeftPixelX + scaledMapWidth]; 
    CLLocationDegrees longitudeDelta = maxLng - minLng; 

    // find delta between top and bottom latitudes 
    CLLocationDegrees minLat = [self pixelSpaceYToLatitude:topLeftPixelY]; 
    CLLocationDegrees maxLat = [self pixelSpaceYToLatitude:topLeftPixelY + scaledMapHeight]; 
    CLLocationDegrees latitudeDelta = -1 * (maxLat - minLat); 

    // create and return the lat/lng span 
    MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta); 
    return span; 
} 

#pragma mark - 
#pragma mark Public methods 

- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate 
        zoomLevel:(double)zoomLevel 
        animated:(BOOL)animated 
{ 
    // clamp large numbers to 28 
    zoomLevel = MIN(zoomLevel, 28); 

    // use the zoom level to compute the region 
    MKCoordinateSpan span = [self coordinateSpanWithMapView:self centerCoordinate:centerCoordinate andZoomLevel:zoomLevel]; 
    MKCoordinateRegion region = MKCoordinateRegionMake(centerCoordinate, span); 

    // set the region like normal 
    [self setRegion:region animated:animated]; 
} 

@end 

#import "MKMapView+ZoomLevel.h" declaración en su controlador de vista donde se toma MKMapView.

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 
{ 
    double zoomLevel = [self getZoomLevel]; 
    [lblCurrentLevel setText:[NSString stringWithFormat:@"%.2f",zoomLevel]]; 

    NSLog(@"zoomlevel-->%f long-->%f lat-->%f",zoomLevel,mapView.region.span.longitudeDelta,mapView.region.span.latitudeDelta); 
} 

- (double) getZoomLevel 
{ 
    return 21.00 - log2(objMapView.region.span.longitudeDelta * MERCATOR_RADIUS * M_PI/(180.0 * objMapView.bounds.size.width)); 
} 

En los métodos anteriores se puede obtener niveles de zoom como se desee, lo único que tiene que hacer es mantener el zoom inicial y comparar última zoom in/out con eso y asignar de nuevo a esa variable.

En caso de cualquier consulta que me haga saber vamos a trabajar en eso: D

Editar

Este código fuente es de Troy's Blog. Disculpa por no mencionar antes.

+0

@ Gracias, Jennis, lo aplicaré y luego te informaré, ¿puedo contactarte directamente? –

+0

avísame mientras lees este comentario, te estoy esperando. –

+0

En realidad, hay un error de "uno por uno" en coordinateSpanWithMapView. Para calcular el zoomExponent, debe restar de 21, no 20; getZoomLevel es correcto. –

Cuestiones relacionadas