【问题标题】:Fitting annotations on a MKMapView while keeping user position centered在 MKMapView 上安装注释,同时保持用户位置居中
【发布时间】:2014-10-17 01:37:36
【问题描述】:

我正在尝试在我的MKMapView 上放置所有注释,同时将当前用户位置保持在地图中心。

已经有很多关于如何缩小区域以适应地图上的注释的参考[1][2],但它们会调整当前的中心位置,例如如果所有注释都位于我当前用户位置的东边,它将进行调整,使当前用户位置向地图左侧移动。

如何缩小我的地图,使其适合显示的所有注释,但保持用户当前位置在地图中心?

参考:

[1]Zooming MKMapView to fit annotation pins?

[2]- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0);

【问题讨论】:

  • 尝试以下操作:获取从用户位置到注释的最大距离。然后使用 MKCoordinateRegionMakeWithDistance 设置一个以用户位置为中心的区域,其纬度/经度距离为 maximumDistance*2。
  • 这是个好主意,我昨天也得出了同样的结论,但我不确定MKCoordinateRegionMakeWithDistance 的变量,因为它们同时采用latitudinalMeterslongitudinalMeters,我是目前只是设置为相同,但我不确定您是否可以轻松做到这一点。我会在几分钟后发布我的方法。
  • 是的,您可以将两者作为相同的值传递,地图视图将根据视图的比例和它可以显示的缩放级别自动调整。

标签: ios iphone mkmapview mkuserlocation


【解决方案1】:

我发现这个解决方案是最可靠的,@Anna 也提出了建议,所以它可能是一个不错的解决方案。

这是我的方法(实现为我继承的MKMapView的方法

- (void)fitAnnotationsKeepingCenter {
  CLLocation *centerLocation = [[CLLocation alloc]
    initWithLatitude:self.centerCoordinate.latitude
    longitude:self.centerCoordinate.longitude];

  // starting distance (do not zoom less than this)
  CLLocationDistance maxDistance = 350;

  for (id <MKAnnotation> vehicleAnnotation in [self annotations]) {
    CLLocation *annotationLocation = [[CLLocation alloc] initWithLatitude:vehicleAnnotation.coordinate.latitude longitude:vehicleAnnotation.coordinate.longitude];
    maxDistance = MAX(maxDistance, [centerLocation distanceFromLocation:annotationLocation]);
  }

  MKCoordinateRegion fittedRegion = MKCoordinateRegionMakeWithDistance(centerLocation.coordinate, maxDistance * 2, maxDistance * 2);
  fittedRegion = [self regionThatFits:fittedRegion];
  fittedRegion.span.latitudeDelta *= 1.2;
  fittedRegion.span.longitudeDelta *= 1.2;

  [self setRegion:fittedRegion animated:YES];
}

【讨论】:

    猜你喜欢
    • 2016-08-22
    • 2012-08-11
    • 2014-08-29
    • 1970-01-01
    • 2013-04-17
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多