2010-01-13 4 views
26

Ist es möglich, den eigenen Standortmanager von MKMapView zu verwenden, um den aktuellen Standort des Benutzers an einen Webdienst zu übergeben?Benutzerstandort von einem MKMapView beziehen

Ich habe mapView.showsUserLocation=YES; und das macht einen gültigen blauen Punkt an meinem Standort zurückkehren, aber im Simulator, seine Cupertino - was in Ordnung ist, aber wenn ich mir

mapView.userLocation.coordinate.latitude, sein gleich 180, während ein CLLocationManager gibt das richtige zurück, 37.3317.

Ich möchte vermeiden, mehrere Location-Manager für meine drei Registerkarten, so dass die Verwendung der mapViews eigenen wäre hilfreich.

Danke.

+0

Hallo Joec, was meinst du mit "das gibt keinen gültigen blauen Punkt an meinem Standort zurück"? Werfen Sie einen Blick auf meine Antwort, dass es hilfreich sein kann. – vfn

+0

Gute Frage! +1, aber ausgewählte Antwort wird nie funktionieren! so -1! –

+0

Die Antworten, die hier akzeptiert wird, ist falsch, es wird nicht funktionieren, für die richtige Lösung lesen Sie die Antworten dieser Frage [http://stackoverflow.com/questions/1449486/iphone-current-user-location-coordinates-showing- as-0-0] (http: // Stapelüberlauf.com/questions/1449486/iphone-current-user-location-coordinates-showing-as-0-0) Hoffe das macht Sinn –

Antwort

40

Sie den Standort des Nutzers aus dem MKMapView bekommen. Sie vermissen nur eine Eigenschaft in Ihrem Abruf davon. Es sollte sein:

mapView.userLocation.location.coordinate.latitude; 

userLocation speichert nur ein CLLocation Standortattribut und ein BOOL Aktualisierung Attribut. Sie müssen zum Standortattribut gehen, um Koordinaten zu erhalten.

-Drew

EDIT: Die userLocation des MKMapView nicht aktualisiert, bis die Karte vollständig geladen wurde, und zu früh überprüft werden Nullen zurück. Um dies zu vermeiden, empfehle ich die MKMapViewDelegate-Methode -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation.

+3

Hallo Joec, hat das für Sie funktioniert. In meinem Fall gibt es 0.0 zurück. – Aisha

+0

seine Rückkehr 0.0000 in meinem Fall auch :( – Piscean

+0

Wenn Sie 0.000 als Standort erhalten, finden Sie bitte meine Bearbeitung in der obigen Antwort. –

3

So einen einzigartigen CLLocateManager zu verwenden, können Sie eine Klasse erstellen, die Delegierten für alle Sie Karten sein, so, anstatt das zu tun.

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

Sie so etwas wie:

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

Dabei ist mySharedDelegate die Klasse mit allen CLLocationManager-Delegatmethoden.

können Sie erhalten nur gültig für die userLocation, nach dem ersten Aufruf von

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

koordinieren Wenn diese Methode aufgerufen wird, ist es, weil das GPS die neue Position und so der blaue Punkt dort bewegt wird gefunden und das userLocation wird die neue Koordinate haben.

Verwenden Sie das folgende Verfahren auf Ihrem CLLocationManager Delegat den aktuellen Standort zu protokollieren, wenn es gefunden wird:

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

Haben Sie auf die Idee gekommen?

Cheers,
VFN

+0

Ist es dann ok, einen separaten Standort-Manager für jede meiner Registerkarten zu haben und nur den Delegierten zu teilen dann? Oder sollte ich einen Standortmanager im App-Delegaten zuweisen und initiieren und diesen verwenden? Vielen Dank. – 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