繁体   English   中英

MKMapView缩放到注释 - annotationVisibleRect

[英]MKMapView Zoom to Annotations - annotationVisibleRect

有没有人有一个例子,说明如何使用MKMapView上的annotationVisibleRect属性将MKMapView缩放到所有可见注释的区域? 我已经看到这篇文章提供了一个不错的解决方案,但似乎这个annotationVisibleRect属性将是最简单的解决方案。

简短回答:使用annotationVisibleRect没有解决这个问题的方法。

没有示例,因为此属性不能以这种方式使用。 对于那些正在寻找MapKit方便的东西来完成一项常见任务的人来说,为它提供的有限文档肯定会产生误导。

annotationVisibleRect是关于MKAnnotationContainerView坐标系的rect。 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];
    }
}

这不会使应用程序崩溃,但也不会改变该区域。 如果将visibleRegionself.mapView.region进行比较,您会发现它们是相同的。 这是因为annotationVisibleRect表示在地图视图中可见的相同区域 - 只是在不同的坐标系中,以方便您执行诸如使地图图钉从视图边缘飞入的操作。 有关如何使用的详细信息,请参阅此答案

另外,作为参考,这里是MKAnnotationViewMKMapView

MKMapView
+-UIView
  +-MKScrollContainerView
    +-MKAnnotationContainerView    <-- coordinate system of annotationVisibleRect
      +-MKAnnotationView

希望有助于澄清一些事情 - 如果没有,请离开。

SWIFT 4

我想你想要的是什么

mapView.showAnnotations(annotations:[MKAnnotation], animated: Bool)

您只需传入一个您正在尝试显示的所有注释的数组,即MKMapView.annotations

mapView.showAnnotations(mapView.annotations, animated: true)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM