使用 MKUserTrackingBarButtonItem 时如何指定缩放级别?

Posted

技术标签:

【中文标题】使用 MKUserTrackingBarButtonItem 时如何指定缩放级别?【英文标题】:How do I specify the zoom level when using an MKUserTrackingBarButtonItem? 【发布时间】:2014-04-21 07:31:34 【问题描述】:

我正在使用MKUserTrackingBarButtonItem 按钮来允许用户自动跟踪他们在地图上的位置。问题是当他们点击这个按钮时,它被放大得太远了。我希望它以指定的缩放级别(即跨度)开始。我怎样才能做到这一点?

当用户点击按钮更改为MKUserTrackingModeFollow 时,它似乎使用了用户上次手动更改的相同缩放级别(即使用地图上的手势)。尝试通过setRegionsetVisibleMapRect 指定不同的缩放级别不会影响模式更改为MKUserTrackingModeFollow 时将使用的缩放级别。

尝试使用override mapView:didChangeUserTrackingMode: 设置区域会导致模式更改回MKUserTrackingModeNone。示例:

- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated 
    if (mode == MKUserTrackingModeFollow) 
        CLLocationCoordinate2D center = mapView.userLocation.location.coordinate;
        MKCoordinateSpan span = MKCoordinateSpanMake(0.002306, 0.001717);
        [mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES];
        // [mapView setUserTrackingMode:MKUserTrackingModeFollow animated:NO];
    

如果我在设置区域后立即尝试重置模式,如果用户静止,它可以正常工作,但如果用户移动,它会缩小。

最简单的解决方案是,如果有一种方法可以通过发送我的跨度值来简单地为 MKUserTraking 指定缩放级别。但是,既然这似乎不存在,我还能做什么?

【问题讨论】:

您找到解决方案了吗?我目前正在努力解决同样的问题。 【参考方案1】:

我遇到了同样的问题并使用了不同的方法来解决它。您可以为此使用 MapCamera 功能而不是那个按钮。

在每个新位置执行以下操作:

 MKMapCamera *newCamera = [MKMapCamera cameraLookingAtCenterCoordinate:[newLocation coordinate]
 fromEyeCoordinate:[oldLocation coordinate]
 eyeAltitude:2000];

 [mapView setCamera:newCamera animated:TRUE];

和眼睛一起玩Altitude。

如果用户手动放大或缩小,您可以从 mapview.camera.altitude 读取高度值,当用户手动使用地图时,也不会更新相机。

【讨论】:

看来这是唯一的办法!【参考方案2】:

根据此处使用的苹果文档

https://developer.apple.com/reference/mapkit/mkmapview/1616208-usertrackingmode

将跟踪模式设置为follow 或followWith​Heading 会使地图视图以该位置为中心,并开始跟踪用户的位置。如果地图被缩小,地图视图会自动放大用户的位置,有效地改变当前的可见区域。

由于这个原因,此处更改区域不会影响您的可见区域。

- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated 
if (mode == MKUserTrackingModeFollow) 
    CLLocationCoordinate2D center = mapView.userLocation.location.coordinate;
    MKCoordinateSpan span = MKCoordinateSpanMake(0.002306, 0.001717);
    [mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES];
    // [mapView setUserTrackingMode:MKUserTrackingModeFollow animated:NO];
 

所以你只需要改变didChangeUserTrackingMode的中心坐标而不是改变整个区域

- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated 
if (mode == MKUserTrackingModeFollow) 
   [self.mapView setCenterCoordinate:mapView.userLocation.location.coordinate animated:YES];
   
 

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

点击 MKUserTrackingBarButtonItem 改变缩放级别

 CLLocationCoordinate2D center = mapView.userLocation.location.coordinate;
MKCoordinateSpan span = MKCoordinateSpanMake(0.002306, 0.001717);
[mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES];

【讨论】:

以上是关于使用 MKUserTrackingBarButtonItem 时如何指定缩放级别?的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)