我正在尝试在MKMapView上绘制多个点。在两个直线之间很容易-我只找到中间坐标并使用它们:
// Center
CLLocationCoordinate2D center;
center.latitude = self.midLatitude;
center.longitude = self.midLongitude;
myRegion.center = center;
但是,如果我在 map 上有洛杉矶,华盛顿特区和西雅图,该怎么办。我有自己的代码,该代码根据数组中的第一个和最后一个坐标计算中心。在上述情况下,我只能看到洛杉矶和西雅图。
有没有其他方法可以确定三点之间的中心?
谢谢!
编辑:
添加了带有MKMapRect的新代码:
-(void) addAnnotation {
MKMapRect showMapRect = MKMapRectNull;
CLLocationCoordinate2D mapLocation;
IGAMapAnnotation *mapAnnotation;
// Calculate how many points are included in the plan
NSInteger numberOfPoints = [coordinatesTempArray count];
MKMapPoint annotationMapPoint;
MKMapRect annotationMapRect;
if (numberOfPoints > 0) {
// Trying to add coordinates from the array of coordinates
for (NSInteger i=0; i < ([coordinatesTempArray count]); i++) {
... // Code that adds annotations
// Adding the annotation to the array that will be added to the map
[mapLocations addObject:mapAnnotation];
// Adding Annotation coordinates to MKMapRect so that they all be visible in the view
annotationMapPoint = MKMapPointForCoordinate(mapLocation);
annotationMapRect = MKMapRectMake(annotationMapPoint.x, annotationMapPoint.y, 0, 0);
showMapRect = MKMapRectUnion(showMapRect, annotationMapRect);
}
}
// Showing all annotations at a time
self.mapView.visibleMapRect = showMapRect;
// Now I am trying to zoom out a bit since the extreme annotation are right at the border of the mapview. THIS DOES NOT WORK.
MKCoordinateRegion region;
region = MKCoordinateRegionForMapRect(annotationMapRect);
MKCoordinateSpan span;
span.latitudeDelta = 0.09;
span.longitudeDelta = 0.09;
region.span = span;
region = [self.mapView regionThatFits:region];
[self.mapView setRegion:region animated:YES];
// Showing all annotations at a time
self.mapView.visibleMapRect = showMapRect;
// Adding annotations to the map
[self.mapView addAnnotations:mapLocations];
}
}
最佳答案
在编辑后的代码中,尝试比计算出的MKMapRect
“缩小一点”不起作用,原因是:
MKCoordinateRegionForMapRect
时,它将传递annotationMapRect
(单个注释的rect)而不是showMapRect
(所有注释的rect)。 showMapRect
中获取跨度并将其扩展一点(我将其乘以1.1)。 setRegion
之后,代码再次使用原始setVisibileMapRect
调用showMapRect
,这将撤消所有对缩小区域的工作。 解决上述问题后,您可以使用
setRegion
缩小一点,但是您已经发现的更简单的方法是使用setVisibleMapRect:edgePadding:animated:
而不是setVisibleMapRect:
。关于
mapViewDidFailLoadingMap
的问题:很难说为什么在您的特定情况下无法加载 map 。
但是不管是什么原因,如果您必须让用户知道 map 加载失败,我的建议是使用
UILabel
而不是UIAlertView
。每次 map 视图加载有问题时,都不要使用户点击“确定”,而应在 map 视图失败/完成加载时显示/隐藏标签。
这样,用户就“变了”,但是不必不停地轻按“确定”。
这可能会给用户带来更令人愉悦的体验。
使标签成为与 map 视图相同的子视图的子视图。也就是说,使他们成为 sibling 。不要将标签设为 map 视图的子视图。最初将标签设置为“隐藏”或将
alpha
设置为0,以便可以在委托方法中为标签显示/隐藏设置动画。您可以将标签放在 map 视图的前面(如果屏幕上没有空间),但不能放在 map 视图的子视图中。例:
//initialize label alpha to 0 in viewDidLoad...
mapLoadFailedLabel.alpha = 0;
-(void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error
{
[UIView animateWithDuration:0.5 animations:^{
mapLoadFailedLabel.alpha = 1.0;
}];
}
-(void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
{
[UIView animateWithDuration:0.5 animations:^{
mapLoadFailedLabel.alpha = 0.0;
}];
}