MKMapView показывает неправильно сохраненную область

Я сохраняю регион карты в пользовательские значения по умолчанию, когда мое приложение iPhone закрывается следующим образом:

MKCoordinateRegion region = mapView.region; [[NSUserDefaults standardUserDefaults] setDouble:region.center.latitude forKey:@"map.location.center.latitude"]; [[NSUserDefaults standardUserDefaults] setDouble:region.center.longitude forKey:@"map.location.center.longitude"]; [[NSUserDefaults standardUserDefaults] setDouble:region.span.latitudeDelta forKey:@"map.location.span.latitude"]; [[NSUserDefaults standardUserDefaults] setDouble:region.span.longitudeDelta forKey:@"map.location.span.longitude"]; 

Когда приложение снова запустится, Ш прочитает эти значения так же, чтобы пользователь мог видеть то же самое представление карты, что и в прошлый раз:

 MKCoordinateRegion region; region.center.latitude = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.center.latitude"]; region.center.longitude = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.center.longitude"]; region.span.latitudeDelta = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.latitude"]; region.span.longitudeDelta = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.longitude"]; NSLog([NSString stringWithFormat:@"Region read : %f %f %f %f", region.center.latitude, region.center.longitude, region.span.latitudeDelta, region.span.longitudeDelta]); [mapView setRegion:region]; NSLog([NSString stringWithFormat:@"Region on map: %f %f %f %f", mapView.region.center.latitude, mapView.region.center.longitude, mapView.region.span.latitudeDelta, mapView.region.span.longitudeDelta]); 

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

Примеры результатов:

 Region read : 50.241110 8.891555 0.035683 0.042915<br> Region on map: 50.241057 8.891544 0.050499 0.054932 

Кто-нибудь знает, почему это происходит?

Проблема здесь в том, когда вы устанавливаете область, уровень масштабирования карты «защелкивается» до ближайшего порога масштабирования. (Я подозреваю, что эти пороговые значения масштабирования – это сумма увеличения, которую вы получаете при двойном касании или двухкратном нажатии)

Поэтому, если на карте отображается масштаб 1, например, и вы устанавливаете область с тем же значением диапазона: region = [mapView region]; [mapView setRegion:region]; region = [mapView region]; [mapView setRegion:region]; он будет «хватать» до ближайшего уровня масштабирования выше уровня 1, то есть уровня 2, и вы уменьшите его примерно в два раза.

Обходной путь для оригинального плаката заключается в том, чтобы немного уменьшить значения диапазона, прежде чем устанавливать область, так что, когда представление защелкивается, оно появляется на уровне масштабирования, на котором оно было, а не на том, что было выше.

например

region.span.latitudeDelta = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.latitude"] * 0.999;

region.span.longitudeDelta = [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.longitude"] * 0.999;

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

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

Для этого есть открытые ошибки на радаре Apple, и, надеюсь, он будет исправлен в будущем выпуске.

Хорошо, поэтому я уже некоторое время борюсь с этой проблемой, и я думаю, что у меня появилось эффективное обходное решение, вдохновленное теорией Крутти ( MKMapView показывает неправильно сохраненный регион ). В принципе, если вы установите область отображения карты со значениями, которые вы извлекаете из своих NSUserDefaults после того, как представление карты выполнило начальную загрузку (в комплекте с поведением «отладка»), регион карты будет тем, что вы ожидаете от него , Трюк заключается в том, чтобы найти крючок в вашем коде приложения где-то ниже по течению от инициализированного представления карты. Не очень, но он отлично работает для меня. Спасибо Крутти за понимание.

У меня такая же проблема. Это очень расстраивает. Похоже, что документация для MKMapView неверна в некоторых областях, относящихся к типам данных.

Если вы зададите параметры области как (двойной), вы получите сообщение об ошибке, которое у вас есть. Однако, если параметры области пройдены (float), вы получите правильное поведение.

Поэтому постарайтесь

 MKCoordinateRegion region = {{0.0f,0.0f},{0.0f,0.0f}}; region.center.latitude = (float) [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.center.latitude"]; region.center.longitude = (float) [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.center.longitude"]; region.span.latitudeDelta = (float) [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.latitude"]; region.span.longitudeDelta = (float) [[NSUserDefaults standardUserDefaults] doubleForKey:@"map.location.span.longitude"]; mapView.region = region; 

Я не могу проверить, что это работает. Может ли кто-нибудь еще это сделать? Я был бы готов поспорить, что то, что вы видите, это эффект усечения ваших удвоений в поплавки. В некоторых случаях, когда это происходит со мной, я обнаружил, что могу умножить диапазон на 0.9999 и сбросить область, и тогда это будет то, что я хочу. Но не во всех регионах – иногда это очень разные, до 20% разные, особенно для небольших площадей.

Я нашел больший успех, используя коэффициент умножения 0,9 вместо 0,999, который он по-прежнему иногда выталкивает, но, похоже, приближается к желаемому масштабированию. По-прежнему хотелось бы решить эту проблему, просто чтобы сказать, что я ее победил! ха-ха

Постарайтесь также хранить отношение как

 self.lastCameraAtitude = self.mapView.camera.altitude; 

и когда u настройте свою карту

 [self.mapView.camera setAltitude:self.lastCameraAtitude]; 

Это будет установлено для той же самой камеры. В вашем случае u устанавливает только область, но не камеру.

Вот расширение Swift для правильного кодирования и декодирования MKCoordinateRegion:

 extension MKCoordinateRegion { var encode:[String: AnyObject] { return ["center": ["latitude": self.center.latitude, "longitude": self.center.longitude], "span": ["latitudeDelta": self.span.latitudeDelta, "longitudeDelta": self.span.longitudeDelta]] } init?(decode: [String: AnyObject]) { guard let center = decode["center"] as? [String: AnyObject], let latitude = center["latitude"] as? Double, let longitude = center["longitude"] as? Double, let span = decode["span"] as? [String: AnyObject], let latitudeDelta = span["latitudeDelta"] as? Double, let longitudeDelta = span["longitudeDelta"] as? Double else { return nil } self.center = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) self.span = MKCoordinateSpan(latitudeDelta: latitudeDelta, longitudeDelta: longitudeDelta) } } 

Вот как это использовать:

 // Save NSUserDefaults.standardUserDefaults().setObject(mapView.region.encode, forKey: "mapRegion01") // Restore if let dict = NSUserDefaults.standardUserDefaults().dictionaryForKey("mapRegion01"), let myRegion = MKCoordinateRegion(decode: dict) { // do something with myRegion } 

Если вы настроили MapView в InterfaceBuilder, убедитесь, что вы этого не делаете:

 _mapView = [[MKMapView alloc] init]; 

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

  • Чтение NSUserDefaults в watchOS 2 (я знаю, что группы приложений не работают)
  • iPhone. Где находится файл , хранящийся на компьютере?
  • Данные Keychain потеряны после обновления приложения на iOS
  • Хранение токенов аутентификации в iOS - NSUserDefaults vs Keychain?
  • iOS - Не удалось сохранить NSDate в NSUserDefaults
  • Xcode iOS: проверьте, вошел ли пользователь в систему и отобразили разные представления, если нет
  • Сохраняйте флажки аксессуаров на uitableview, когда пользователи загружают просмотр несколько раз
  • ios programming - Аргумент данных, не используемый строкой формата
  • NSUserDefaults: Можно ли получить userDefaults из другого приложения?
  • Сохранить словарь в NSUserDefaults Swift
  • NSUserDefaultsDidChangeNotification: как называется ключ, который изменился?
  • Interesting Posts

    Как воспроизводить звуковой файл с максимальным объемом в iOS без изменения индикатора звука

    Кадр свойства не найден на объекте типа _strong id

    iOS отображает обратную трассировку с именами методов также в выпущенном продукте

    TableHeaderView не отвечает на прикосновения

    Я хочу подражать смешиванию слоя «мягкий свет» слоя Photoshop в iOS

    Результаты выборки данных базовой партии

    Основной каталог активов приложений, скопированный в настоящее время

    UICollectionView с автосогласованием ячейки (оцененный размер) и sectionHeadersPinToVisibleBounds идет умственно

    как обнаружить пользовательское имя удаленного доступа iOS?

    Разработка iOS для предприятий – TestFlight

    CGContextFillRects: недопустимый контекст – Цель C

    Проведите по экрану с помощью UITableViewCell: ячейка сжимается

    IOS 7.1: Распределение корпоративных приложений не работает

    iOS: Есть ли способ открыть защищенные паролем документы Microsoft Office?

    IOS: проверьте, находится ли точка внутри прямоугольника

    Давайте будем гением компьютера.