【问题标题】:MKMapView doesn't zoom correctly while user tracking mode is MKUserTrackingModeFollowWithHeading用户跟踪模式为 MKUserTrackingModeFollowWithHeading 时,MKMapView 无法正确缩放
【发布时间】:2013-10-22 12:43:55
【问题描述】:

我用几行代码和两个组件创建了一个测试项目:MKMapView 和 UIButton。我勾选了mapView 选项 - Shows user location。我还为按钮定义了一个动作,它将地图缩放到用户位置。

这是来自控制器的代码:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    self.mapView.userTrackingMode = MKUserTrackingModeFollowWithHeading;
    self.mapView.delegate = self;
}

- (IBAction)changeRegion:(id)sender {
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(self.mapView.userLocation.coordinate, 200.0f, 200.0f);
    [self.mapView setRegion:region animated:YES];
}

非常简单明了,不是吗?但是当我点击按钮时,我看到了奇怪的行为:地图视图缩放到指定区域然后返回到原始缩放。有什么问题?如何同时保持缩放和跟踪用户位置?

我注意到与 MKUserTrackingModeFollow 跟踪模式类似的行为。

附:我忘了说这主要是 iOS7 的问题

【问题讨论】:

  • iOS 10 上也会发生这种情况

标签: ios objective-c mapkit


【解决方案1】:

来自苹果文档:

将跟踪模式设置为 MKUserTrackingModeFollow 或 MKUserTrackingModeFollowWithHeading 使地图视图居中 映射到该位置并开始跟踪用户的位置。如果 地图缩小,地图视图自动放大用户的 位置,有效地改变当前可见区域。

如果您既要调整区域又要跟踪用户,建议您检查位置更新并相应调整缩放。

例如:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 200.0f, 200.0f);
    [self.mapView setRegion:region animated:YES];
}

编辑

不要设置区域,而是设置中心,

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
    [self.mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];
}

并让您的按钮操作设置缩放,保持相同的中心:

- (IBAction)changeRegion:(id)sender {
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(self.mapView.centerCoordinate, 200.0f, 200.0f);
    [self.mapView setRegion:region animated:YES];
}

而且非常重要:不要将您的 mapView 设置为跟踪用户。禁用跟踪用户,因为现在您正在自己跟踪它。我认为默认是MKUserTrackingModeNone。

【讨论】:

  • 我实现了委托方法- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 它以某种方式工作。但我不是很满意。刚开始,点击按钮仍然无法正常工作。当我事先平移或缩放地图时,按钮开始正常工作。
  • @Ossir 这是因为当您平移或缩放时,您会禁用用户跟踪。即使您接受了我的回答,我还是编辑以尝试帮助您实现您想要的。检查我对帖子所做的编辑。希望对你有帮助。
  • 您可以在用户位置上显示图标而不跟踪用户。你只需要:[mapView setShowsUserLocation:YES];这将在地图上显示蓝点,但不会跟随用户。干杯。
  • 跟踪用户本人非常滞后,并且标题/位置跳跃。我认为苹果正在做一些内部工作来猜测下一个变化。有没有办法在使用原生跟踪模式时调整缩放而不求助于自定义跟踪?
  • @yuf 我有完全相同的要求。 5 年后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多