iphone - framework - objective c vs swift
MKMapView zoom a la ubicaciĆ³n de los usuarios en viewDidLoad? (10)
¿estableciste showsUserLocation = YES
? MKMapView
no actualizará la ubicación si está configurada en NO
. Así que asegúrate de eso.
Es muy probable que el objeto MKMapView
aún no tenga la ubicación del usuario. Para hacerlo bien, debe adoptar el protocolo MKMapViewDelegate
e implementar mapView:didUpdateUserLocation:
map.delegate = self;
...
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
MKCoordinateRegion mapRegion;
mapRegion.center = mapView.userLocation.coordinate;
mapRegion.span.latitudeDelta = 0.2;
mapRegion.span.longitudeDelta = 0.2;
[mapView setRegion:mapRegion animated: YES];
}
Estoy intentando ampliar un mapa en la ubicación actual del usuario una vez que se cargue la vista, pero aparece el error "** * Aplicación de finalización debido a una excepción no detectada ''NSInvalidArgumentException'', razón: ''Región no válida'' " cuando se carga la vista . Por favor alguien puede ayudar?
¡Aclamaciones!
- (void)viewDidLoad
{
[super viewDidLoad];
MKCoordinateRegion mapRegion;
mapRegion.center.latitude = map.userLocation.coordinate.latitude;
mapRegion.center.longitude = map.userLocation.coordinate.longitude;
mapRegion.span.latitudeDelta = 0.2;
mapRegion.span.longitudeDelta = 0.2;
[map setRegion:mapRegion animated: YES];
}
......
MKCoordinateRegion region =mapView.region;
region.center.latitude = currentLocation.latitude ;
region.center.longitude = currentLocation.longitude;
region.span.longitudeDelta /= 1000.0;
region.span.latitudeDelta /= 1000.0;
[mapView setRegion:region animated:YES];
[mapView regionThatFits:region];
Al igual que con la respuesta de Deepak, excepto que podría establecer el tramo de manera más elegante:
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
MKCoordinateRegion mapRegion;
mapRegion.center = map.userLocation.coordinate;
mapRegion.span = MKCoordinateSpanMake(0.2, 0.2);
[map setRegion:mapRegion animated: YES];
}
Aquí está la respuesta de @ Deepak en Swift 3 para iOS 10:
extension ViewController: MKMapViewDelegate
{
func mapView( _ mapView: MKMapView, didUpdate userLocation: MKUserLocation )
{
let regionRadius = 400 // in meters
let coordinateRegion = MKCoordinateRegionMakeWithDistance( userLocation.coordinate, regionRadius, regionRadius )
self.mapView.setRegion( coordinateRegion, animated: true)
}
}
Compruebe el valor de map.userLocation.coordinate
, el resto está bien.
Con mucho, la manera más fácil es usar mapView.showAnnotaciones en didUpdateUserLocation:
func mapView(mapView: MKMapView!, didUpdateUserLocation userLocation: MKUserLocation!) {
mapView.showAnnotations([userLocation], animated: true)
}
¡Eso es todo!
MKUserLocation se ajusta al protocolo MKAnnotation. Pase el userLocation como una matriz, el método showAnnotations permitirá que el mapView amplíe una región más el relleno que abarca la matriz de MKAnnotations, en este caso es solo userLocation. Funciona para mi.
Si solo desea acercar una vez, use una propiedad initialUserLocation para verificar si la propiedad inicial ya estaba configurada. No me gusta usar dispatch_once en absoluto para ese tipo de cosas
Consulte el método setUserTrackingMode of MKMapView. Probablemente la forma más fácil de rastrear la ubicación del usuario en un MKMapView es
[self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
De esta forma, tampoco es necesario que sea un MKMapViewDelegate. Los modos posibles son:
MKUserTrackingModeNone = 0, // the user''s location is not followed
MKUserTrackingModeFollow, // the map follows the user''s location
MKUserTrackingModeFollowWithHeading, // the map follows the user''s location and heading
El problema que ocurre cuando utiliza el método didUpdateUserLocation
, no podrá desplazarse ni acercarse a otra ubicación. Seguirá apuntando a tu ubicación. La mejor manera (que lo he intentado) es que necesite usar el administrador de ubicación.
En viewDidLoad
agrega lo siguiente:
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.distanceFilter = kCLLocationAccuracyKilometer;;
// showing user location with the blue dot
[self.mapView setShowsUserLocation:YES];
self.mapView.delegate = self;
// getting user coordinates
CLLocation *location = [_locationManager location];
CLLocationCoordinate2D coordinate = [location coordinate];
// showing them in the mapView
_mapView.region = MKCoordinateRegionMakeWithDistance(coordinate, 250, 250);
[self.locationManager startUpdatingLocation];
De esta forma, podría mostrar su ubicación con el zoom que desee. Espero que esto sea de ayuda.
No desea actualizar esto dentro de userDidUpdateLocation si existe la posibilidad de que el usuario quiera desplazarse por el mapa. Si coloca ese código en el método mencionado, el usuario no podrá desplazarse por el mapa porque se llamará a la función y centrará el mapa de nuevo en la ubicación actual.
Versión de Swift 3 Utilice este método para acercar cualquier coordenada.
extension MKMapView{
func zoomIn(coordinate: CLLocationCoordinate2D, withLevel level:CLLocationDistance = 10000){
let camera =
MKMapCamera(lookingAtCenter: coordinate, fromEyeCoordinate: coordinate, eyeAltitude: level)
self.setCamera(camera, animated: true)
}
}