【问题标题】:MKMapView Zoom to Annotations - annotationVisibleRectMKMapView 缩放到注释 - annotationVisibleRect
【发布时间】:2012-01-16 15:32:18
【问题描述】:

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

【问题讨论】:

  • 链接帖子中的第二个答案有您正在寻找的内容。但是设置 region 还是 visibleMapRect 并没有什么区别。
  • 它没有说明如何使用 annotationVisibleRect 属性。这正是我想要的。

标签: mkmapview


【解决方案1】:

简答: 使用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];
    }
}

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

另外,作为参考,这里是MKAnnotationView 相对于MKMapView 的位置:

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

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

【讨论】:

  • 感谢您提供非常详细的回复。我早就把这段代码留在了尘土中,但你的解释很有帮助。如果我回到那个代码,我会确保参考你的帖子。
  • np,我找了一会儿才找到答案,所以我相信其他人在某些时候会在这里绊倒。
【解决方案2】:

SWIFT 4

我想你要找的是什么

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

您只需传入一个包含您要显示的所有注释的数组,即MKMapView.annotations

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

【讨论】:

    猜你喜欢
    • 2011-02-22
    • 1970-01-01
    • 2010-12-08
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2013-10-31
    • 1970-01-01
    相关资源
    最近更新 更多