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