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

时间:2014-04-21 07:31:34

标签: ios objective-c mapkit apple-maps

我使用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指定类似缩放级别的内容。但是,由于这似乎不存在,我还能做些什么呢?

2 个答案:

答案 0 :(得分:7)

我有同样的问题,并使用不同的方法来解决它。您可以使用MapCamera函数代替该按钮。

在每个新位置执行此操作:

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

 [mapView setCamera:newCamera animated:TRUE];

玩眼睛高度。

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

答案 1 :(得分:0)

根据此处使用的Apple文档

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

将跟踪模式设置为跟随或跟随使用标题会导致地图视图将地图置于该位置的中心,并开始跟踪用户的位置。如果地图缩小,地图视图会自动放大用户的位置,从而有效地更改当前可见区域。

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

- (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];