使用 MKUserTrackingBarButtonItem 时如何指定缩放级别?
Posted
技术标签:
【中文标题】使用 MKUserTrackingBarButtonItem 时如何指定缩放级别?【英文标题】:How do I specify the zoom level when using an MKUserTrackingBarButtonItem? 【发布时间】:2014-04-21 07:31:34 【问题描述】:我正在使用MKUserTrackingBarButtonItem
按钮来允许用户自动跟踪他们在地图上的位置。问题是当他们点击这个按钮时,它被放大得太远了。我希望它以指定的缩放级别(即跨度)开始。我怎样才能做到这一点?
当用户点击按钮更改为MKUserTrackingModeFollow
时,它似乎使用了用户上次手动更改的相同缩放级别(即使用地图上的手势)。尝试通过setRegion
或setVisibleMapRect
指定不同的缩放级别不会影响模式更改为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 或followWithHeading 会使地图视图以该位置为中心,并开始跟踪用户的位置。如果地图被缩小,地图视图会自动放大用户的位置,有效地改变当前的可见区域。
由于这个原因,此处更改区域不会影响您的可见区域。
- (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有三种方式(不使用,动态使用,静态使用,默认是动态使用)