2010-01-13 19 views
26

¿Es posible utilizar el propio administrador de ubicación del MKMapView para devolver la ubicación actual de los usuarios para pasar a un servicio web?Obtener la ubicación del usuario desde un MKMapView

que tienen mapView.showsUserLocation=YES; y esto hace volver un punto azul válida en mi lugar, pero en el simulador, su Cupertino - lo cual está bien, pero cuando miro a

mapView.userLocation.coordinate.latitude, su igual a 180, mientras que un CLLocationManager devuelve el correcto, 37.3317.

Quiero evitar tener múltiples administradores de ubicación para mis tres pestañas, por lo que sería útil usar mapViews.

Gracias.

+0

Hola joec, ¿Qué quieres decir con "esto no devuelve un punto azul válido en mi ubicación"? Mire mi respuesta que puede ser útil. – vfn

+0

¡Buena pregunta! +1, ¡pero la respuesta seleccionada nunca funcionará! entonces -1 –

+0

Las respuestas que se aceptan aquí son incorrectas, No funcionará, para la solución correcta, lea las respuestas a esta pregunta [http://stackoverflow.com/questions/1449486/iphone-current-user-location-coordinates-showing- as-0-0] (http: // stackoverflow.com/questions/1449486/iphone-current-user-location-coordinates-showing-as-0-0) Espero que esto tenga sentido –

Respuesta

40

Usted puede obtener la ubicación del usuario desde el MKMapView. Solo estás perdiendo una propiedad en tu recuperación. Debe ser:

mapView.userLocation.location.coordinate.latitude; 

userLocation solo almacena un atributo de ubicación CLLocation y un atributo de actualización BOOL. Debe ir al atributo de ubicación para obtener coordenadas.

-Drew

EDIT: userLocation del MKMapView no se actualiza hasta que el mapa ha terminado de cargar, y comprobando demasiado pronto volverá ceros. Para evitar esto, sugiero usar el método MKMapViewDelegate -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation.

+3

Hola joec, esto funcionó para ti. En mi caso, devuelve 0.0. – Aisha

+0

su devolución de 0.0000 en mi caso también :( – Piscean

+0

Si obtiene 0.000 como ubicación, vea mi edición en la respuesta anterior. –

3

Por lo tanto, el uso de un CLLocateManager único, puede crear una clase para ser el delegado por todo lo que los mapas, por lo que, en lugar de hacerlo:.

self.locationManager = [[CLLocationManager alloc] init]; 
    _locationManager.delegate = self;

hacer algo como:

self.locationManager = [[CLLocationManager alloc] init]; 
    _locationManager.delegate = mySharedDelegate;

Donde mySharedDelegate es su clase con todos los métodos de delegado CLLocationManager.

Sólo se puede obtener una coordenada válido para la userLocation, después de la primera convocatoria de

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

Cuando este método se llama es porque el GPS ha encontrado la nueva ubicación y por lo que el punto azul será trasladado hasta allí y userLocation tendrá la nueva coordenada.

utilizar el método siguiente de su delegado CLLocationManager para registrar la ubicación actual cuando se encuentra:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    NSLog(@"---------- locationManager didUpdateToLocation"); 
    location=newLocation.coordinate; 

    NSLog(@"Location after calibration, user location (%f, %f)", _mapView.userLocation.coordinate.latitude, _mapView.userLocation.coordinate.longitude); 
}

¿Posee la idea?

Saludos,
VFn

+0

¿Está bien entonces, tener un administrador de ubicación separado para cada una de mis pestañas y solo compartir el delegado? ¿entonces? ¿O debería asignar e iniciar un administrador de ubicación en el delegado de la aplicación y usar eso? Gracias. – joec

0
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
    { 
     NSLog(@"welcome into the map view annotation"); 

     // if it's the user location, just return nil. 
     if ([annotation isKindOfClass:[MyMapannotation class]]) 
     { 
      MyMapannotation *annotation12=(MyMapannotation *)annotation; 
      // try to dequeue an existing pin view first 
      static NSString* AnnotationIdentifier = @"AnnotationIdentifier"; 
      MKPinAnnotationView* pinView = [[MKPinAnnotationView alloc] 
              initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] ; 
      pinView.animatesDrop=YES; 
      pinView.canShowCallout=YES; 
      pinView.pinColor=MKPinAnnotationColorPurple; 
      pinView.tag=annotation12.tag; 

      UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      [rightButton setTitle:annotation.title forState:UIControlStateNormal]; 
      rightButton.tag=annotation12.tag; 
      [rightButton addTarget:self 
          action:@selector(showDetails:) 
        forControlEvents:UIControlEventTouchUpInside]; 
      pinView.rightCalloutAccessoryView = rightButton; 
      UIImageView *profileIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"artpin"]]; 
      pinView.image = profileIconView.image; 
      return pinView; 
     } 
     else 
      return nil; 
    } 

    -(IBAction)showDetails:(id)sender 
    { 
     UIButton *btn=(UIButton *)sender; 

    } 


    -(void)Load_mapview 
    { 


     for (int i=0; i<[arr_nearby count]; i++) 
     { 
      NSNumber *latitude = [[[[arr_nearby objectAtIndex:i] valueForKey:@"geometry"] valueForKey:@"location"] valueForKey:@"lat"]; 

      NSNumber *longitude = [[[[arr_nearby objectAtIndex:i] valueForKey:@"geometry"] valueForKey:@"location"] valueForKey:@"lng"]; 

      NSString *title = [[arr_nearby objectAtIndex:i] valueForKey:@"name"]; 

      //Create coordinates from the latitude and longitude values 

      CLLocationCoordinate2D coord; 

      coord.latitude = latitude.doubleValue; 

      coord.longitude = longitude.doubleValue; 

      MyMapannotation *annotation = [[MyMapannotation alloc] initWithTitle:title AndCoordinate:coord andtag:i]; 
      [_map_nearby addAnnotation:annotation]; 


      // [annotations addObject:annotation]; 

     } 

     [self zoomToLocation]; 


    } 
    -(void)zoomToLocation 

    { 

     CLLocationCoordinate2D zoomLocation; 

     zoomLocation.latitude = [[[[[arr_nearby objectAtIndex:0] valueForKey:@"geometry"] valueForKey:@"location"] valueForKey:@"lat"] floatValue]; 

     zoomLocation.longitude= [[[[[arr_nearby objectAtIndex:0] valueForKey:@"geometry"] valueForKey:@"location"] valueForKey:@"lng"] floatValue]; 

     MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, 7.5*5,7.5*5); 

     [_map_nearby setRegion:viewRegion animated:YES]; 

     [_map_nearby regionThatFits:viewRegion]; 

    } 

// 
// MyMapannotation.h 
// IOS_Googgle 
// 
// Created by Vivek Chauhan on 27/06/16. 
// Copyright (c) 2016 anand. All rights reserved. 
// 

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h> 


@interface MyMapannotation : NSObject <MKAnnotation> 

@property (nonatomic,copy) NSString *title; 
@property (nonatomic,assign) int tag; 


@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; 

-(id) initWithTitle:(NSString *) title AndCoordinate:(CLLocationCoordinate2D)coordinate andtag:(int)tagofbutton; 


@end 


// 
// MyMapannotation.m 
// IOS_Googgle 
// 
// Created by Vivek Chauhan on 27/06/16. 
// Copyright (c) 2016 anand. All rights reserved. 
// 

#import "MyMapannotation.h" 

@implementation MyMapannotation 

@synthesize coordinate=_coordinate; 

@synthesize title=_title; 
@synthesize tag=_tag; 


-(id) initWithTitle:(NSString *) title AndCoordinate:(CLLocationCoordinate2D)coordinate andtag:(int)tagofbutton 

{ 

    self = [super init]; 

    _title = title; 

    _coordinate = coordinate; 
    _tag=tagofbutton; 

    return self; 

} 
@end 
Cuestiones relacionadas