Нераспознанная ошибка в MapView (iOS) - PullRequest
3 голосов
/ 06 декабря 2011

В MapView появляется ошибка, которую я не распознаю и не могу найти документацию.Выглядит это так:

CoreAnimation: ignoring exception: 
Invalid Region <center:-180.00000000, -180.00000000 
                  span:+2.81462803, +28.12500000>

Очевидно, что цифры сейчас не входят в мой код, но я не могу понять, что происходит.MapView работает очень хорошо, и все мои аннотации отображаются (и масштабируется на месте пользователя, как будто я его установил).На что конкретно это указывает?

Спасибо.


Вот метод, который я использую для увеличения местоположения пользователя.Это немного неортодоксально, но это то, что мне помогло, так как у меня были проблемы с масштабированием по разным причинам (я могу объяснить, если это необходимо, но, вероятно, это не актуально):

- (void)zoomToUserLocation:(MKUserLocation *)userlocation
{
    if (!userlocation)
        return;

    MKCoordinateRegion region;
    region.center = userlocation.coordinate;
    region.span = MKCoordinateSpanMake(2.0, 2.0);
    region = [self.mapView regionThatFits:region];
    [self.mapView setRegion:region animated:YES];
}

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [self zoomToUserLocation:self.mapView.userLocation];
}

- (void)mapView:(MKMapView *)theMapView didUpdateUserLocation:(MKUserLocation *)location
{
    [self zoomToUserLocation:location];
}

Ответы [ 2 ]

6 голосов
/ 06 декабря 2011

Не могу сказать, откуда поступают неверные координаты, но я предлагаю добавить следующие проверки в метод zoomToUserLocation.

Просто проверить, недостаточно ли userlocation nil. Вы также должны проверить, является ли свойство location внутри userlocation нулевым или нет. Тогда , вы можете использовать свойство coordinate (особенно если вы используете координаты вне метода делегата didUpdateUserLocation).

Кроме того, просто проверять, является ли coordinate 0,0 (технически допустимая координата), не рекомендуется, поскольку структура будет иметь значение "ноль", если она никогда не была установлена ​​или могла даже заполняться случайными данными. Функция CLLocationCoordinate2DIsValid Базового каркаса используется в качестве последней линии защиты для предотвращения недопустимой области.

Вы также можете проверить timestamp и horizontalAccuracy, если хотите.

- (void)zoomToUserLocation:(MKUserLocation *)userlocation
{
    if (!userlocation)
        return;

    if (!userlocation.location)
    {
        NSLog(@"actual location has not been obtained yet");
        return;
    }

    //optional: check age and/or horizontalAccuracy
    //(technically should check if location.timestamp is nil first)
    NSTimeInterval locationAgeInSeconds = 
        [[NSDate date] timeIntervalSinceDate:userlocation.location.timestamp];
    if (locationAgeInSeconds > 300)  //adjust max age as needed
    {
        NSLog(@"location data is too old");
        return;
    }

    if (!CLLocationCoordinate2DIsValid(userlocation.coordinate))
    {
        NSLog(@"userlocation coordinate is invalid");
        return;
    }

    MKCoordinateRegion region;
    region.center = userlocation.coordinate;
    region.span = MKCoordinateSpanMake(2.0, 2.0);

    //region = [self.mapView regionThatFits:region];
    //don't need to call regionThatFits explicitly, setRegion will do it

    [self.mapView setRegion:region animated:YES];
}

Кроме того (возможно, не связанных, и вы, возможно, уже сделали это, но), основываясь на паре ваших предыдущих вопросов, связанных с этим, вы можете очистить и заново установить delegate вида карты в контроллере вида карты viewWillDisappear и viewWillAppear методы предотвращения определенных ошибок:

-(void)viewWillAppear:(BOOL)animated
{
    mapView.delegate = self;
}

-(void)viewWillDisappear:(BOOL)animated
{
    mapView.delegate = nil;
}
3 голосов
/ 03 февраля 2012

Я обнаружил, что если у вас включены службы определения местоположения, а затем отображается представление карты, которое содержит текущее местоположение пользователя в качестве аннотации, затем отключите службы определения местоположения и попытайтесь использовать свойство "местоположение" для аннотации, результат будет (-180, -180).

...