MKMapView或CLLocationManger - 确定用户的当前位置

时间:2015-01-28 07:30:09

标签: ios cocoa-touch mkmapview mapkit cllocationmanager

有两个类有助于制作地图绘图和确定用户位置 - MKMapViewCLLocationManager

MKMapView有一个委托“didUpdateUserLocation”,告诉用户当前的位置。同时,CLLocationManger有一个代理“didUpdateToLocation”,它也会做同样的事情。

我的问题是何时使用MKMapViewCLLocationManager。我可以从MKMapView获取设备的当前位置,然后我应该使用CLLocationManager的原因和时间?我试图得到它,但我仍然不确定。

2 个答案:

答案 0 :(得分:2)

我认为您将MKMapView属性showsUserLocationCLLocationManager混淆。

为方便起见,MKMapView允许您简单地启用属性以在地图UI上显示用户的当前位置。如果您只需要向用户显示他们在地图上的位置,这非常方便。

但是,有很多其他用例只是在地图上显示位置是不够的,这就是CLLocationManager的用武之地。

考虑一个运行/培训应用程序,其中需要记录用户位置来计算运行距离,甚至是我自己的应用程序中的一个示例,我需要找到用户位置(纬度/经度)实时计算到各个火车站的距离,以识别哪个火车站最接近用户。在这些示例中,不需要MapView,因此使用LocationManager是正确的选择。

任何时候您需要以编程方式与用户位置进行交互,并且基本上不需要地图UI!

答案 1 :(得分:0)

我更喜欢使用MKMapView内部使用的CLLocationManager,因此如果您不需要使用地图,只需使用位置管理器中的以下代码。

locationManager = [[CLLocationManager alloc] init];
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.delegate = self;
[locationManager startUpdatingLocation];

不要忘记将locationManager实例存储在类中的某个位置,您可以像这样实现委托。

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    NSLog(@"Error detecting location %@", error);
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    CLLocation* location = (CLLocation*)locations.lastObject;
    NSLog(@"Longitude: %f, Latitude: %f", location.coordinate.longitude, location.coordinate.latitude);
}

修改

您可以使用Apple的Geo编码器根据用户的位置获取用户的地址

// Use Apple's Geocoder to figure the name of the place
    CLGeocoder* geoCoder = [[CLGeocoder alloc] init];
    [geoCoder reverseGeocodeLocation:location completionHandler: ^(NSArray* placemarks, NSError* error) {
        if (error != nil) {
            NSLog(@"Error in geo coder: %@", error);
        }
        else {
            if (placemarks.count == 0) {
                NSLog(@"The address couldn't be found");
            }
            else {
                // Get nearby address
                CLPlacemark* placemark = placemarks[0];

                // Get the string address and store it
                NSString* locatedAt = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];
                location.name = locatedAt;

                NSLog(@"The address is: %@", locatedAt);
            }
        }
    }];