Проблема с масштабированием MapView с использованием текущего местоположения - PullRequest
1 голос
/ 30 марта 2012

Я показываю вид карты на первой странице моего приложения, я устанавливаю регион и координаты из текущего местоположения, используя CLLocation. Когда приложение запускается, синий экран отображается на виде карты, когда я открываю его дочерние виды и возвращаюсь к основному экрану, карта отлично отображается с расположением и уровнем масштабирования. Что-то не так в следующем коде, который вызывает синий экран?

- (void)viewWillAppear:(BOOL)animated {  
    CLLocationManager *lm = [[CLLocationManager alloc] init];
    lm.delegate = self;
    lm.desiredAccuracy = kCLLocationAccuracyBest;
    lm.distanceFilter = kCLDistanceFilterNone; 
    [lm startUpdatingLocation];

    CLLocation *location = [lm location];

    CLLocationCoordinate2D coord;


    coord = [location coordinate];

    CLLocationCoordinate2D zoomLocation;
    zoomLocation.latitude = coord.latitude; //39.281516;
    zoomLocation.longitude= coord.longitude; //-76.580806;

    MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, 0.3*METERS_PER_MILE, 0.3*METERS_PER_MILE);

    MKCoordinateRegion adjustedRegion = [self.mainMapView regionThatFits:viewRegion];                

    [self.mainMapView setRegion:adjustedRegion animated:YES];      
}

1 Ответ

4 голосов
/ 30 марта 2012

Полагаю, вы видите синий, потому что его местоположение (0, 0) находится посреди моря.Возможно, потому что в первый раз местоположение на CLLocationManager еще не установлено.

Возможно, вам следует проверить, есть ли еще местоположение, а если нет, то дождаться обратного вызова в методе CLLocationManagerDelegate * 1005.* и затем центрируйте карту в нужном месте.

Примерно так:

...
@property (nonatomic, assign) BOOL needsCentering
...

@synthesize needsCentering = _needsCentering;

- (void)viewWillAppear:(BOOL)animated {  
    CLLocationManager *lm = [[CLLocationManager alloc] init];
    lm.delegate = self;
    lm.desiredAccuracy = kCLLocationAccuracyBest;
    lm.distanceFilter = kCLDistanceFilterNone; 
    [lm startUpdatingLocation];

    CLLocation *location = [lm location];

    if (!location) {
        _needsCentering = YES;
    } else {
        _needsCentering = NO;

        CLLocationCoordinate2D coord;

        coord = [location coordinate];

        CLLocationCoordinate2D zoomLocation;
        zoomLocation.latitude = coord.latitude; //39.281516;
        zoomLocation.longitude= coord.longitude; //-76.580806;

        MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, 0.3*METERS_PER_MILE, 0.3*METERS_PER_MILE);

        MKCoordinateRegion adjustedRegion = [self.mainMapView regionThatFits:viewRegion];                

        [self.mainMapView setRegion:adjustedRegion animated:YES];
    }
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    if (_needsCentering) {
        _needsCentering = NO;

        CLLocationCoordinate2D coord;

        coord = [newLocation coordinate];

        CLLocationCoordinate2D zoomLocation;
        zoomLocation.latitude = coord.latitude; //39.281516;
        zoomLocation.longitude= coord.longitude; //-76.580806;

        MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, 0.3*METERS_PER_MILE, 0.3*METERS_PER_MILE);

        MKCoordinateRegion adjustedRegion = [self.mainMapView regionThatFits:viewRegion];                

        [self.mainMapView setRegion:adjustedRegion animated:YES];
    }
}

Но вы также можете взглянуть на showsUserLocation из MKMapView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...