Uso de los botones IBAction para ampliar MapView

Tengo un problema. Mi location actual se muestra y se centra en una vista de map, sin embargo, la región del map no se amplía. Traté de tomar el consejo de Rob tomando span y región del método didUpdateToLocation pero no lo he implementado correctamente. No creo que esté reconociendo mi llamada a setRegion en viewDidLoad y mis botones no están siendo reconocidos. Por favor verifique mi código a continuación y señale los errores. Mi objective es poder acercar y alejar mi location con los botones IBAction.

.marido

- (IBAction)zoomIn:(id)sender; - (IBAction)zoomOut:(id)sender; 

.m en viewDidLoad

 double miles = 0.5; MKCoordinateSpan span; span.latitudeDelta = miles/69.0; span.longitudeDelta = miles/69.0; MKCoordinateRegion region; region.span = span; [self.mapView setRegion:region animated:YES]; [self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES]; _mapView.mapType = MKMapTypeSatellite; 

.m en mi método didUpdateToLocation.

 [self.mapView setCenterCoordinate:newLocation.coordinate animated:YES]; 

.Acercarse:

 - (IBAction)zoomIn:(id)sender { MKCoordinateSpan span; span.latitudeDelta = _mapView.region.span.latitudeDelta * 2; span.longitudeDelta = _mapView.region.span.latitudeDelta * 2; MKCoordinateRegion region; region.span = span; region.center = _mapView.region.center; [self.mapView setRegion:region animated:YES]; } 

.Disminuir el zoom :

 - (IBAction)zoomOut:(id)sender { MKCoordinateSpan span; span.latitudeDelta = _mapView.region.span.latitudeDelta / 2; span.longitudeDelta = _mapView.region.span.latitudeDelta / 2; MKCoordinateRegion region; region.span = span; region.center = _mapView.region.center; [self.mapView setRegion:region animated:YES]; } 

Puede get la region actual, multiplicar o dividir el span entre dos, según corresponda (dividiendo al acercar el zoom, multiplicando el alejamiento), y luego establezca la region :

 - (IBAction)zoomIn:(id)sender { MKCoordinateRegion region = self.mapView.region; region.span.latitudeDelta /= 2.0; region.span.longitudeDelta /= 2.0; [self.mapView setRegion:region animated:YES]; } - (IBAction)zoomOut:(id)sender { MKCoordinateRegion region = self.mapView.region; region.span.latitudeDelta = MIN(region.span.latitudeDelta * 2.0, 180.0); region.span.longitudeDelta = MIN(region.span.longitudeDelta * 2.0, 180.0); [self.mapView setRegion:region animated:YES]; } 

Si desea que el map haga un zoom automático a su location, puede usar:

 self.mapView.userTrackingMode = MKUserTrackingModeFollow; 

Si desea hacer esto manualmente, puede hacer algo como lo siguiente. Primero, defina una propiedad de class para si ya ha ampliado o no:

 @property (nonatomic) BOOL alreadySetZoomScale; 

luego cambie su didUpdateLocations (o didUpdateToLocation ) para comprobar esto y configure la escala de zoom una vez:

 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { CLLocation* newLocation = [locations lastObject]; // if less than zero, then valid lat and long not found if (newLocation.horizontalAccuracy < 0) return; if (!self.alreadySetZoomScale) { MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(newLocation.coordinate, 1609, 1609); // 1 mile = 1609.34 meters self.mapView.region = region; [self.mapView setRegion:region animated:YES]; self.alreadySetZoomScale = YES; } else { [self.mapView setCenterCoordinate:newLocation.coordinate animated:YES]; } } - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { // if prior to iOS 6, use this old `MKMapViewDelegate` method, but call our // other routine. if (SYSTEM_VERSION_LESS_THAN(@"6.0")) [self locationManager:manager didUpdateLocations:@[newLocation]]; } 

Esto básicamente dice: "si aún no he hecho zoom, establezca la región en function de la newLocation y cierta cantidad de metros alnetworkingedor de esa location, pero si ya lo hice, solo estableceré la coorderada central en function de mi location actual , pero no cambie la escala del zoom (en caso de que ya haya hecho zoom). Esto también conlleva una lógica condicional del número de versión de iOS (usando las macros que se muestran aquí ), asegurándose de que el usuario final esté ejecutando iOS antes de 6.0 , que llamará a nuestro método actualizado.

Por cierto, si muestra la location del usuario en el map (p self.mapView.showsUserLocation = YES; Ej., self.mapView.showsUserLocation = YES; ), es posible que desee que didUpdateLocations elimine también la superposition asociada con MKUserLocation antes de mover el centro del map; de lo contrario, puede dejar la antigua superposition sentada:

 [self.mapView removeOverlays:self.mapView.overlays]; 

Prueba esto. Pero aún no lo he probado.

 - (IBAction)zoomIn:(id)sender { MKCoordinateSpan span; span.latitudeDelta = _mapView.region.span.latitudeDelta * 2; span.longitudeDelta = _mapView.region.span.latitudeDelta * 2; MKCoordinateRegion region; region.span = span; region.center = _mapView.region.center; [self.mapView setRegion:region animated:YES]; } - (IBAction)zoomOut:(id)sender { MKCoordinateSpan span; span.latitudeDelta = _mapView.region.span.latitudeDelta / 2; span.longitudeDelta = _mapView.region.span.latitudeDelta / 2; MKCoordinateRegion region; region.span = span; region.center = _mapView.region.center; [self.mapView setRegion:region animated:YES]; } 

OK, esto es lo que terminé de usar para get mis 2 botones IBAction (zoomIn y zoomOut) para trabajar con mi mapView. Cuando abre la aplicación, se muestra la location del usuario y el map se amplía y se centra alnetworkingedor. A continuación, puede usar los botones para acercar o alejar un factor de 2. * Muchas gracias a Rob, quien me mostró el path.

.marido

 - (IBAction)zoomIn:(id)sender; - (IBAction)zoomOut:(id)sender; 

.metro

 @interface LocationViewController () @property (nonatomic) BOOL alreadySetZoomScale; @end -(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { if (!_alreadySetZoomScale) { MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(newLocation.coordinate, 1609, 1609); // 1 mile = 1609.34 meters self.mapView.region = region; [self.mapView setRegion:region animated:YES]; _alreadySetZoomScale = YES; } else { [self.mapView setCenterCoordinate:newLocation.coordinate animated:YES]; } - (IBAction)zoomIn:(id)sender { MKCoordinateRegion region = self.mapView.region; region.span.latitudeDelta /= 2.0; region.span.longitudeDelta /= 2.0; self.mapView.region = region; } - (IBAction)zoomOut:(id)sender {; MKCoordinateRegion region = self.mapView.region; region.span.latitudeDelta *= 2.0; region.span.longitudeDelta *= 2.0; self.mapView.region = region; } 

Tengo un par de llamadas a MKMapView como self.mapView.showsUserLocation = YES; en viewDidLoad pero eso es más o less.

Swift 2.0:

Uso de la extensión:

 extension MKMapView{ func zoomInPinAnnotationLocation(targetMapViewName : MKMapView?, delta: Double) { var region: MKCoordinateRegion = targetMapViewName!.region region.span.latitudeDelta /= delta region.span.longitudeDelta /= delta targetMapViewName!.region = region } func zoomOutPinAnnotationLocation(targetMapViewName : MKMapView?,delta: Double) { var region: MKCoordinateRegion = targetMapViewName!.region region.span.latitudeDelta *= delta region.span.longitudeDelta *= delta targetMapViewName!.region = region } } 

Uso:

 var mapViewZoomStepperValue: Double = -1.0 @IBOutlet weak var mapViewZoomStepper: UIStepper! @IBAction func mapViewZoomStepperValueChanged(sender: AnyObject) { if (mapViewZoomStepper.value > mapViewZoomStepperValue) { mapViewZoomStepperValue = mapViewZoomStepperValue + 1.0 //Zoom In detailMapView.zoomInPinAnnotationLocation(detailMapView, delta: 3.0) } else { mapViewZoomStepperValue = mapViewZoomStepper.value - 1.0 //Zoom Out detailMapView.zoomOutPinAnnotationLocation(detailMapView, delta: 3.0) } } 

Swift 3:

 import GoogleMaps import GooglePlaces import CoreLocation import UIKit class LocationMapView: UIViewController, GMSMapViewDelegate, CLLocationManagerDelegate { @IBOutlet weak var mapView: GMSMapView! var mapViewZoomStepperValue: Float = 0.0 @IBOutlet weak var mapViewZoomStepper: UIStepper! override func viewDidLoad() { super.viewDidLoad() mapViewZoomStepper.minimumValue = -100 } @IBAction func mapViewZoomStepperValueChanged(_ sender: Any) { if (Float(mapViewZoomStepper.value) > mapViewZoomStepperValue){ mapViewZoomStepperValue = Float(mapViewZoomStepper.value) zoomIn() }else{ mapViewZoomStepperValue = Float(mapViewZoomStepper.value) zoomOut() } } func zoomIn() { print("Zoom in!!") if mapView.camera.zoom == mapView.maxZoom { return } let currentZoom = mapView.camera.zoom + 1 mapViewZoomController(currentZoom) } func zoomOut() { print("Zoom out!!") if mapView.camera.zoom == mapView.minZoom { return } let currentZoom = mapView.camera.zoom - 1 mapViewZoomController(currentZoom) } func mapViewZoomController(_ level: Float) { let point: CGPoint = mapView.center let coor: CLLocationCoordinate2D = mapView.projection.coordinate(for: point) let camera = GMSCameraPosition.camera(withLatitude: coor.latitude, longitude: coor.longitude, zoom: Float(level)) mapView.animate(to: camera) } } 

Podrías lograr lo más básico en 3 líneas de código

 var region: MKCoordinateRegion = self.mapView.region region = MKCoordinateRegionMake(self.mapView.centerCoordinate, MKCoordinateSpanMake(0.005, 0.005)); self.mapView.setRegion(region, animated: true)