ios ios6 mkmapview zoom ibaction

ios - Uso de los botones IBAction para acercar a MapView



ios6 mkmapview (6)

Tengo un problema. Mi ubicación actual se muestra y se centra en una vista de mapa, sin embargo, la región del mapa no se acerca. Intenté seguir los consejos de Rob quitando span y region del método didUpdateToLocation, pero no debo haberlo implementado correctamente. No creo que reconozca mi llamada a setRegion en viewDidLoad y mis botones no están siendo reconocidos. Por favor revisa mi código a continuación y señala los errores. Mi objetivo es poder acercar y alejar mi ubicación utilizando 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]; }


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é usando para que mis 2 botones IBAction (zoomIn y zoomOut) funcionen con mi mapView. Cuando abre la aplicación, se muestra la ubicación del usuario y el mapa se acerca y se centra en torno a ella. A continuación, puede usar los botones para acercar o alejar la imagen por un factor de 2. * Muchas gracias a Rob que me mostró el camino.

.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 otras llamadas a MKMapView como self.mapView.showsUserLocation = YES; en viewDidLoad, pero eso es todo.


Swift 2.0:

Usando 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) } }


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)


Puede obtener la region actual, multiplicar o dividir el span entre dos, según corresponda (dividir al acercarse, multiplicar al alejarse) y luego establecer 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 mapa se acerque automáticamente a su ubicación, puede usar:

self.mapView.userTrackingMode = MKUserTrackingModeFollow;

Si desea hacer esto manualmente, puede hacer algo como lo siguiente. Primero, defina una propiedad de clase para si ya hizo zoom o no:

@property (nonatomic) BOOL alreadySetZoomScale;

a continuación, cambie su didUpdateLocations (o didUpdateToLocation ) para comprobar esto y establecer 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 newLocation , configure la región según la newLocation y una cierta cantidad de metros alrededor de esa ubicación, pero si ya lo hice, simplemente configure las coordenadas del centro en función de mi ubicación actual , pero no cambie la escala del zoom (en caso de que ya haya aumentado o disminuido). Esto también hace cierta lógica de número de versión iOS condicional (usando las macros que se muestran aquí ), asegurándose de que el usuario final ejecute iOS antes de la 6.0 , que llamará a nuestro método actualizado.

Por cierto, si está mostrando la ubicación del usuario en el mapa (por ejemplo, self.mapView.showsUserLocation = YES; ), es posible que desee que this didUpdateLocations también elimine la superposición asociada con MKUserLocation antes de mover el centro del mapa; de lo contrario, puede dejar la vieja plantilla sentada:

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


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) } }