嘿所以我有一个地图视图,可以在查看加载时放大用户位置。目前,我使用CLLocationManager
找到用户位置,并在didUpdateLocations委托方法中初始化地图。但是,由于这被多次调用,我使用全局BOOL
,在映射设置一次后设置为true,然后再也不设置它。这是代码:
定义全局BOOL
并在viewDidLoad中将其设置为false
:
@implementation MainMapViewController
{
BOOL hasInitializedMap;
}
- (void)viewDidLoad
{
[super viewDidLoad];
hasInitializedMap = NO;
}
然后我获取用户的位置并在(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
委托方法中设置地图缩放:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *location = [locations lastObject];
[self initializeMainMapView:location.coordinate.longitude latitude:location.coordinate.latitude];
}
- (void)initializeMainMapView:(float)longitude latitude:(float)latitude
{
if (!hasInitializedMap)
{
CLLocationCoordinate2D zoomLocation;
zoomLocation.latitude = latitude;
zoomLocation.longitude = longitude;
MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, 1500, 1500);
[mainMapView setRegion:viewRegion animated:YES];
hasInitializedMap = YES;
}
}
此代码有效,但让我想知道是否有更好的方法来执行此操作。我讨厌使用像这样的全局标志,因为它可能会使你的代码混乱,并且充其量只是草率。有没有更好的方法来做我想做的事情?是否有一个委托方法只在第一次更新用户位置时才被调用?我是否可以仅使用MKMapView完成此操作并完全忘记CoreLocation
?
答案 0 :(得分:1)
我已经通过几种方式完成了......实际上框架已经改变了几次,所以我无法记住我是如何确定它的。 MKMapkit确实有一种显示用户位置的方法developer doc:
此属性不指示用户的位置是否在地图上实际可见,仅指示地图视图是否应尝试显示它。将此属性设置为YES会导致地图视图使用Core Location框架查找当前位置并尝试在地图上显示它。只要此属性为YES,地图视图就会继续跟踪用户的位置并定期更新。此属性的默认值为NO。
显示用户的位置并不能保证该位置在地图上可见。用户可能已将地图滚动到不同的点,导致当前位置在屏幕外。要确定用户当前位置当前是否显示在地图上,请使用userLocationVisible属性。
用户的位置将显示为注释。您可以获取注释并放大。更好的方法是将该标志与MKMapViewDelegate结合使用,后者有一个方法-mapView:DidUpdateUserslocation:
也许在您获得第一个之后,您可以将地图的跟踪模式更改为无(我不确定是否删除了用户位置注释,如果是,则可以轻松删除用合适的皮肤贴图。 -setUserTrakingMode:animated:是MKMap可以使用的方法。
我要注意的一件事是,在编写过去使用过用户位置的应用时,需要几秒钟才能获得准确的位置。在锁定某个位置之前,您可能希望首先让GPS ping几次。我发现前几个滴答声可能非常不准确。希望有所帮助。