我有这个代码在用户的位置设置地图:
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>
有什么想法吗?
答案 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