MKMapView缩放到注解 - annotationVisibleRect
有没有人有一个例子,如何使用MKMapView上的annotationVisibleRect属性将MKMapView缩放到所有可见注释的区域?我见过this post,它提供了一个体面的解决方案,但是看起来这个annotationVisibleRect属性是最简单的解决方案。MKMapView缩放到注解 - annotationVisibleRect
简短回答:使用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
希望帮助明确一些事情了 - 如果没有,问了。
感谢您的详细回复。我早已将这些代码留在尘土中,但您的解释有很大帮助。如果我回到该代码,我将确保引用您的帖子。 – 2012-11-16 16:43:56
np,我寻找了一段时间才找到答案,所以我确信其他人会在某处绊跌。 – Mark 2012-11-19 15:18:15
SWIFT 4
我觉得你想找的是
mapView.showAnnotations(annotations:[MKAnnotation], animated: Bool)
您只需通过在所有注释的数组你想显示这是MKMapView.annotations
mapView.showAnnotations(mapView.annotations, animated: true)
链接帖子中的第二个答案就是你要找的。但是,设置region或visibleMapRect并没有什么不同。 – Anna 2012-01-16 15:39:30
虽然它没有解决如何使用annotationVisibleRect属性。那真是我正在寻找的东西。 – 2012-01-21 23:48:27