为什么MKMapView让我入海?

时间:2010-09-08 10:16:58

标签: iphone mapkit mkmapview

我有这个代码在用户的位置设置地图:

MKCoordinateSpan span;
span.latitudeDelta=0.2;
span.longitudeDelta=0.2; 

CLLocationCoordinate2D location=mapView.userLocation.coordinate;
location = mapView.userLocation.location.coordinate;

MKCoordinateRegion region;
region.span=span;
region.center=location;

[mapView setRegion:region animated:TRUE];
[mapView regionThatFits:region];

现在,当我mapView.showsUserLocation=YES时,它会在正确的位置显示我的位置(在我的设备上,以及模拟器中的苹果公司),但是,上面的代码都将我放在非洲附近的某个海域! / p>

有什么想法吗?

4 个答案:

答案 0 :(得分:14)

纬度/经度对0/0位于英格兰格林威治以南的赤道上。那个地方位于非洲西海岸的几内亚湾。如果那是您放置引脚的位置,那么您的mapView.userLocation未设置。

可能你的代码在MKMapKit有机会获得它的位置之前就已经运行了。你真正想做的是让你的viewController采用MKMapKitDelegate协议,将地图视图的.delegate属性设置为self,然后实现方法:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation

当地图工具包找到用户时,将调用该方法,您可以使用您在那里传递的userLocation值来设置地图上的区域。然而,在第一次调用之前,MapView仍然在定位自己,而你对它的位置的询问是不成熟的。

此外,您所在的地区最终会安排在那里。该方法不会调整区域的大小,它实际上会返回一个已调整大小的区域,供您使用。因此,您希望将地图视图的区域设置为该方法返回的内容。像这样:

[mapView setRegion:[mapView regionThatFits:region] animated:TRUE];

答案 1 :(得分:0)

我所做的是在info.plist上添加以下条目:

NSLocationAlwaysUsageDescription

将此信息添加到此(非常好)的教程中: https://www.youtube.com/watch?v=Z272SMC9zuQ

答案 2 :(得分:0)

您可以选择此方法..

- (void)mapView:(MKMapView *)_mapView regionDidChangeAnimated:(BOOL)animated{

CLGeocoder *ceo = [[CLGeocoder alloc]init];
CLLocation *loc = [[CLLocation alloc]initWithLatitude:_mapView.region.center.latitude longitude:_mapView.region.center.longitude];
CLLocationAccuracy accuracy = _mapView.userLocation.location.horizontalAccuracy;

if (accuracy) {
    current_pickup_location = loc;
    [_currentStreetSpinner startAnimating];
    [ceo reverseGeocodeLocation:loc
              completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error){
                  CLPlacemark *placemark = [placemarks objectAtIndex:0];
                  NSString *locatedAt = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];
                  //                  NSLog(@"location %@",placemark.location);
                  NSLog(@"I am currently at %@",locatedAt);
                  _currentStreetLabel.text = locatedAt;
                  static_iVar = _currentStreetLabel.text;
                  [_currentStreetSpinner stopAnimating];
                  [self listDoctorsWithSpeciality_id:currentSpeciality_id
                               withProfessionalityId:currentProfessionality_id];
              }];
}

}

答案 3 :(得分:0)

我正在回答这个问题,因为选择的答案并没有真正帮助我,而且我遇到了同样的问题。 didUpdateUserLocation不太实用,因为它使应用程序每次更改位置时都会更新。上述解决方案的另一个问题是,当地图加载时,询问位置还为时尚早。那么如何在地图加载之前询问用户位置,以便缩放不会将您带到非洲?

您需要使用viewDidLoad上的位置管理器来请求该位置。之后,您可以设置区域。

SWIFT 3

ps1