无法获取当前位置来设置地图中心

时间:2013-09-05 05:40:04

标签: ios objective-c mkmapview cllocationmanager

我正在学习使用地图,我的目标是在应用程序首次加载时在地图上显示当前位置,而不是显示世界地图。但我无法专注于所需的位置,因为我得到的坐标都是0。

注意:

  1. 我在Xcode中设置了默认位置,如日本东京。
  2. 所有代码都在viewDidLoad
  3. 我正在使用模拟器
  4. 我尝试过使用2种方法。

    方法A)我将showsUserLocation设置为YES。然后将地图的中心设置为map的userLocation中的值。但是用户位置为空,latitutude和经度为0.000000。

    方法B)我创建位置管理器并从中获取经度和纬度。获得纬度和经度也是0.000000。

    以下是代码:

    ViewController.h

    #import <UIKit/UIKit.h>
    #import <MapKit/MapKit.h>
    #import <CoreLocation/CoreLocation.h>
    
    @interface ViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate>
         @property (weak, nonatomic) IBOutlet MKMapView *myMap;
         @property CLLocationManager *locationManager;
    @end
    

    ViewController.m

    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
    //Approach A)
        self.myMap.showsUserLocation = YES; //tokyo Japan, blue pin with ripple displays on Default Location that I set in XCode = Tokyo, Japan
    
        NSLog(@"using MapView.userLocation, user location = %@", self.myMap.userLocation.location); //output = null
        NSLog(@"using MapView.userLocation, latitude = %f", self.myMap.userLocation.location.coordinate.latitude); //output = 0.000000
        NSLog(@"using MapView.userLocation, longitude = %f", self.myMap.userLocation.location.coordinate.longitude); //output = 0.000000
    
        CLLocationCoordinate2D centerCoord = {self.myMap.userLocation.location.coordinate.latitude, self.myMap.userLocation.location.coordinate.longitude};
        [self.myMap setCenterCoordinate:centerCoord animated:TRUE]; //nothing happens, as latitude and longitude = 0.000000
    
    //Approach B)
        // create the location manager
        CLLocationManager *locationManager;
        if (nil == self.locationManager) {
        self.locationManager = [[CLLocationManager alloc] init];
        }
    
        self.locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
        self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
        self.locationManager.delegate = self; //add as suggested
        [self.locationManager startUpdatingLocation];
    
        NSLog(@"using LocationManager:current location latitude = %f, longtitude = %f", self.locationManager.location.coordinate.latitude, self.locationManager.location.coordinate.longitude);
    
        //if getting latitude and longitude, will call "setCenterCoordinate"
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
      //add as suggested
    -(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
    {    
         NSLog(@"didUpdateToLocation:Latitude :  %f", newLocation.coordinate.latitude);
         NSLog(@"didUpdateToLocation:Longitude :  %f", newLocation.coordinate.longitude);
    
         [self.locationManager stopUpdatingLocation];
    }    
       @end
    

    输出:

    xxxx using MapView.userLocation, user location = (null)
    xxxx using MapView.userLocation, latitude = 0.000000
    xxxx using MapView.userLocation, longitude = 0.000000
    xxxx using LocationManager:current location latitude = 0.000000, longtitude = 0.000000
    

    现在输出:

    xxx using MapView.userLocation, user location = (null)
    xxx using MapView.userLocation, latitude = 0.000000
    xxx using MapView.userLocation, longitude = 0.000000
    xxx using LocationManager:current location latitude = 0.000000, longtitude = 0.000000
    xxx didUpdateToLocation:Latitude :  35.702069
    xxx didUpdateToLocation:Longitude :  139.775327
    

3 个答案:

答案 0 :(得分:3)

CoreLocation.framework添加到您的项目并添加到.h文件 还有

locationManager.delegate = self; // may be you forget to it.

并添加委托方法,如

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

    NSLog(@"Latitude :  %f", newLocation.coordinate.latitude);
    NSLog(@"Longitude :  %f", newLocation.coordinate.longitude);

    [currentLocation stopUpdatingLocation];
}

答案 1 :(得分:1)

 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
    {
        currentLocation=[userLocation coordinate];
        MKCoordinateRegion region=MKCoordinateRegionMakeWithDistance(currentLocation, 100000, 100000);
        [_map setRegion:region];
    }
It also updates the location if it changes and set the current location as the visible
 region of the map.Import CoreLocation.framework

答案 2 :(得分:0)

你可以先设置

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

然后跟随方法获取当前位置的坐标