Не могу сказать, откуда поступают неверные координаты, но я предлагаю добавить следующие проверки в метод 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;
}