MKMapView和放大用户位置的最佳方式



嘿,所以我有一个地图视图,可以在视图加载时放大用户的位置。 目前,我使用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吗?

我已经用几种方式做到了......事实上,这个框架已经改变了几次,所以我不记得我是如何确定它的。MKMapkit确实有一种显示用户位置的方法,开发人员文档:

此属性不指示用户的位置是否实际在地图上可见,仅指示地图视图是否应尝试显示它。将此属性设置为 YES 会导致地图视图使用核心位置框架查找当前位置并尝试在地图上显示该位置。只要此属性为 YES,地图视图就会继续跟踪用户的位置并定期更新。此属性的默认值为 NO。

显示用户的位置并不能保证该位置在地图上可见。用户可能已将地图滚动到其他点,导致当前位置不在屏幕外。若要确定用户的当前位置当前是否显示在地图上,请使用 userLocationVisible 属性。

用户的位置将显示为批注。您可以获取注释并放大它。更好的方法是将该标志与MKMapViewDelegate结合使用,MKMapViewDelegate具有方法-mapView:DidUpdateUserslocation:

委托文档

也许在你得到第一个之后,你可以将地图的跟踪模式更改为无(我不确定这是否删除了用户位置注释,如果是这样,你可以轻松地将地图图钉放在那里使用适当的皮肤(。 -setUserTrakingMode:animated:是MKMap上可以使用的方法。

我要提醒的一件事是,在过去编写与用户位置配合使用的应用程序时,需要几秒钟才能获得准确的位置。您可能希望在锁定位置之前先让 GPS ping 几次。我发现前几个刻度可能非常不准确。希望有帮助。

最新更新