有没有人有一个如何在MKMapView上使用annotationVisibleRect属性将MKMapView缩放到所有可见注释区域的示例?我见过this post提供了一个不错的解决方案,但似乎这个annotationVisibleRect属性是最简单的解决方案。
答案 0 :(得分:10)
简答:使用annotationVisibleRect
无法解决此问题。
没有示例,因为此属性不能以这种方式使用。对于那些正在寻找MapKit方便的东西来完成一项常见任务的人来说,为它提供的有限文档肯定会产生误导。
annotationVisibleRect
是关于MKAnnotationContainerView
坐标系的矩形。 MKAnnotationContainerView
是您的注释的超级视图。如果您查看MKMapView.h,您会发现:
// annotationVisibleRect is the visible rect where the annotations views are currently displayed.
// The delegate can use annotationVisibleRect when animating the adding of the annotations views in mapView:didAddAnnotationViews:
@property (nonatomic, readonly) CGRect annotationVisibleRect;
其特定目的是通过在超视图的坐标系中提供与地图视图的视口匹配的矩形来操作(动画)注释视图。
你可能会认为(就像我一样)这个或类似的东西会起作用:
CGRect visibleRect = self.mapView.annotationVisibleRect;
MKCoordinateRegion visibleRegion = [self.mapView convertRect:visibleRect toRegionFromView:self.mapView];
[self.mapView setRegion:visibleRegion animated:YES];
不会。调用setRegion:animated:
可能导致应用程序崩溃,因为“fromView”是不正确的坐标系,可能导致纬度或经度超过其最小值/最大值。你实际上必须做这样的事情:
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views
{
if(views.count > 0) {
MKAnnotationView *view = [views objectAtIndex:0];
CGRect visibleRect = self.mapView.annotationVisibleRect;
MKCoordinateRegion visibleRegion = [self.mapView convertRect:visibleRect toRegionFromView:view.superview];
[self.mapView setRegion:visibleRegion animated:YES];
}
}
这不会使应用程序崩溃,但也不会改变该区域。如果您将visibleRegion
与self.mapView.region
进行比较,您会发现它们是相同的。这是因为annotationVisibleRect
表示在地图视图中可见的相同区域 - 只是在不同的坐标系中,以便您可以方便地执行诸如使地图引脚从边缘飞入视图。有关如何使用的详细信息,请参阅this answer。
另外,作为参考,这里是MKAnnotationView
与MKMapView
相关的位置:
MKMapView
+-UIView
+-MKScrollContainerView
+-MKAnnotationContainerView <-- coordinate system of annotationVisibleRect
+-MKAnnotationView
希望有助于澄清一些事情 - 如果没有,请求离开。
答案 1 :(得分:1)
SWIFT 4
我认为你所寻找的是
mapView.showAnnotations(annotations:[MKAnnotation], animated: Bool)
您只需传入一个您正在尝试显示的所有注释的数组MKMapView.annotations
mapView.showAnnotations(mapView.annotations, animated: true)