【发布时间】:2016-08-06 10:40:04
【问题描述】:
由于地图已经显示了用户位置(使用 IsShowingUser),我只想缩放到该位置。这很容易吗,还是我需要在每个平台上获取位置,因为我没有找到任何 GeoLocation 对象。只有地理编码器... 这不是缩放到用户位置的常见用例吗?
【问题讨论】:
标签: c# xamarin maps xamarin.forms
由于地图已经显示了用户位置(使用 IsShowingUser),我只想缩放到该位置。这很容易吗,还是我需要在每个平台上获取位置,因为我没有找到任何 GeoLocation 对象。只有地理编码器... 这不是缩放到用户位置的常见用例吗?
【问题讨论】:
标签: c# xamarin maps xamarin.forms
你需要用你感兴趣的职位调用MoveToRegion方法。
您可以使用Geolocator Plugin for Xamarin获取PCL项目中的位置:
var locator = CrossGeolocator.Current;
var position = await locator.GetPositionAsync(10000);
map.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(position.Latitude, position. Longitude),
Distance.FromMiles(1)));
更新:Xamarin Forms 现在默认包含 Xamarin.Essentials: Geolocation
【讨论】:
locator?这在文章中从未解释过
IsShowingUser 设置为true
var position = await locator.GetPositionAsync(5000);
map.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(position.Latitude, position.Longitude), Distance.FromMiles(1))
var zoomLevel = 9; // between 1 and 18
var latlongdegrees = 360 / (Math.Pow(2, zoomLevel));
map.MoveToRegion(new MapSpan (map.VisibleRegion.Center, latlongdegrees, latlongdegrees));
参考:https://developer.xamarin.com/guides/xamarin-forms/working-with/maps/
【讨论】:
这不是缩放到用户位置的常见用例吗?
是的,是的。对于 iOS,只需使用 MKMapView ShowUserLocation 属性。
来自苹果纪录片:
将此属性设置为 YES 会导致地图视图使用核心位置框架来查找当前位置并尝试将其显示在地图上。
那么您如何在 Xamarin 中做到这一点? 您将需要一个扩展 Xamarin Forms MapRenderer 的自定义渲染器。获取原生地图并将 ShowUserLocation 属性设置为 true。
这是一个例子:
private void MoveToCurrentPosition()
{
var nativeMap = Control as MKMapView;
if (nativeMap == null)
return;
nativeMap.ShowsUserLocation = true;
}
还将nativeMap.SetUserTrackingMode(MKUserTrackingMode.Follow, true);设置为自动关注用户。
地图初始化时这可能不起作用,因为 iOS 还无法获取用户位置。因此,如果您需要在地图出现时显示当前用户位置,只需使用 MKUserLocationEventArgs 的 EventHandler 并使用 DidUpdateUserLocation 事件即可。你可以这样做:
private EventHandler<MKUserLocationEventArgs> _didUpdateUserLocationEventHandler;
// In OnElementChanged:
_didUpdateUserLocationEventHandler = (_, __) =>
{
MoveToCurrentPosition();
nativeMap.DidUpdateUserLocation -= _didUpdateUserLocationEventHandler;
};
nativeMap.DidUpdateUserLocation += _didUpdateUserLocationEventHandler;
不要忘记取消注册此活动。仅将其用于通常的初始化行为。用户应该可以随意在地图上滚动。
【讨论】: