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

时间:2014-09-25 22:35:33

标签: ios objective-c mkmapview ios8 core-location

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

1 个答案:

答案 0 :(得分:1)

我已经通过几种方式完成了......实际上框架已经改变了几次,所以我无法记住我是如何确定它的。 MKMapkit确实有一种显示用户位置的方法developer doc

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

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

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

delegate documentation

也许在您获得第一个之后,您可以将地图的跟踪模式更改为无(我不确定是否删除了用户位置注释,如果是,则可以轻松删除用合适的皮肤贴图。 -setUserTrakingMode:animated:是MKMap可以使用的方法。

我要注意的一件事是,在编写过去使用过用户位置的应用时,需要几秒钟才能获得准确的位置。在锁定某个位置之前,您可能希望首先让GPS ping几次。我发现前几个滴答声可能非常不准确。希望有所帮助。