我使用此代码在我的地图上显示我的所有注释:
MKMapRect zoomRect = MKMapRectNull;
for (id <MKAnnotation> annotation in mapView.annotations)
{
MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 1000);
if (MKMapRectIsNull(zoomRect)) {
zoomRect = pointRect;
} else {
zoomRect = MKMapRectUnion(zoomRect, pointRect);
}
}
[mapView setVisibleMapRect:zoomRect animated:YES];
但我的地图应用程序上还有一个“我的位置”按钮,按下后会显示我自己的位置。
如何将我的位置添加到MKMapRect,以便它显示所有注释以及我自己的位置?
答案 0 :(得分:0)
您可以使用[myMapView setShowsUserLocation: YES];
来显示用户的位置(我假设它是“我的位置”,并且您将地图视图命名为“myMapView”)。
这将显示蓝点,就像地图应用程序一样。但是它不会改变视图。
您可以通过创建和设置跨越所有注释的最大和最小经度和纬度的新区域来重新定位视图,以便所有注释都可见。代码看起来像这样。
// Get all the coordinates
NSArray *coordinates = [myMapView valueForKeyPath:@"annotations.coordinate"];
// Longitude and latitude max and min
CLLocationCoordinate2D maxCoord = {-90.0f, -180.0f};
CLLocationCoordinate2D minCoord = {90.0f, 180.0f};
for(NSValue *value in coordinates) {
CLLocationCoordinate2D coord = {0.0f, 0.0f};
// Unpack the NSValue to get the CLLocationCoordinate2D struct inside
[value getValue:&coord];
// Update max and min to
if(coord.longitude > maxCoord.longitude) {
maxCoord.longitude = coord.longitude;
}
if(coord.latitude > maxCoord.latitude) {
maxCoord.latitude = coord.latitude;
}
if(coord.longitude < minCoord.longitude) {
minCoord.longitude = coord.longitude;
}
if(coord.latitude < minCoord.latitude) {
minCoord.latitude = coord.latitude;
}
}
// Create a new region that covers all the annotations
MKCoordinateRegion region = {{0.0f, 0.0f}, {0.0f, 0.0f}};
region.center.longitude = (minCoord.longitude + maxCoord.longitude) / 2.0;
region.center.latitude = (minCoord.latitude + maxCoord.latitude) / 2.0;
region.span.longitudeDelta = (maxCoord.longitude - minCoord.longitude);
region.span.latitudeDelta = (maxCoord.latitude - minCoord.latitude);
region = [myMapView regionThatFits:region];
// Animate to the new region
[myMapView setRegion:region animated:YES];
这是有效的,因为蓝色用户位置点也是注释。因此,您可能需要更新注释代码的视图以解决此问题,例如。
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
MKAnnotationView *view = nil;
if (annotation != mapView.userLocation) {
// Your code here...
}
return view;
}
但是,这不会随用户位置更新而更新。您需要调用自己更新地图区域的代码。您可以仅在用户点击“我的位置”按钮时执行此操作,或者只要用户移动足够,您就可以使用Core Location来获取事件。每次用户移动几百米时更新地图区域会消耗大量电池,并且可能过度杀伤,具体取决于您的应用程序。