更新中心点和放大MKMapView(iPhone)

时间:2011-09-26 19:48:07

标签: objective-c ios4 mkmapview core-location latitude-longitude

我一直在尝试将地图视图置于用户位置的中心位置。这也应该在注册位置更改时更新。我遇到的问题是在加载应用程序时我无法掌握当前的经度和经度来应用中心和放大器。变焦。

这些是我到目前为止的关键代码......

- (void)viewDidLoad
{
    self.locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [locationManager startUpdatingLocation];

    [self updateMapZoomLocation:locationManager.location];

    [super viewDidLoad];
}

这个想法是它应该创建一个位置管理器的实例,然后开始更新位置。最后它应该运行我写的函数来相应地更新地图视图......

- (void)updateMapZoomLocation:(CLLocation *)newLocation
{
    MKCoordinateRegion region;
    region.center.latitude = newLocation.coordinate.latitude;
    region.center.longitude = newLocation.coordinate.longitude;
    region.span.latitudeDelta = 0.1;
    region.span.longitudeDelta = 0.1;
    [map setRegion:region animated:YES];   
}

然而,这似乎并未发生。该应用程序构建并运行正常,但所有显示的都是黑屏 - 就好像坐标不存在一样?!

我还有一个委托方法,通过调用上面的函数处理任何更新...

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation
{
    [self updateMapZoomLocation:newLocation];
}

我已经尝试过查看其他几个类似的问题了。之前回答过但我似乎无法找到我追求的解决方案。

对此的任何帮助都会非常感激;我花了几个小时的时间在网上搜寻帮助和解决方案。

PS。 'map'是mapView。

2 个答案:

答案 0 :(得分:3)

您想使用MKMapViewDelegate回调,因此只有在实际知道位置后才放大:

这里有一些快速处理的代码:

var alreadyZoomedIn = false

func mapView(mapView: MKMapView!, didUpdateUserLocation userLocation: MKUserLocation!) {
    if(!alreadyZoomedIn) {
        self.zoomInOnCurrentLocation()
        alreadyZoomedIn = true
    }
}

func zoomInOnCurrentLocation() {

        var userCoordinate = mapView?.userLocation.coordinate
        var longitudeDeltaDegrees : CLLocationDegrees = 0.03
        var latitudeDeltaDegrees : CLLocationDegrees = 0.03
        var userSpan = MKCoordinateSpanMake(latitudeDeltaDegrees, longitudeDeltaDegrees)
        var userRegion = MKCoordinateRegionMake(userCoordinate!, userSpan)

        mapView?.setRegion(userRegion, animated: true)
}

答案 1 :(得分:2)

您不应在viewDidLoad函数期间调用updateMapZoomLocation,因为位置管理器尚未到达某个位置。如果/何时它会在准备就绪时调用委托函数。在此之前,您的地图将不知道在哪里居中。您可以尝试尽可能远地缩放,或者在应用程序关闭之前记住上次查看的位置。