Установка MKUserTrackingModeFollowWithHeading - PullRequest
9 голосов
/ 30 октября 2011

Я попытался установить режим отслеживания пользователя в методе viewDidLoad (и в viewWillAppear).Если я установлю его в MKUserTrackingModeFollowWithHeading (значение 2), он не вступит в силу.На самом деле, сразу после установки его значения в 2, если я распечатаю это значение, это 1, почему?Я никогда не видел такого в программировании!

Вот как я его установил:

[self.mapView setUserTrackingMode: MKUserTrackingModeFollowWithHeading 
                         animated: YES];

Если я делаю то же самое в методе viewWillAppear, эффект тот же.Однако во второй раз, когда отображается этот вид, настройка вступит в силу.(У меня есть вкладка viewcontroller, я переключаю вид на другой, а затем переключаю обратно).

То, как я вижу, это не действует, это две меры: (1) вывести его значение сразу после его установки (2) в режиме карты заголовок не отображается.

Что происходит?

Ответы [ 5 ]

14 голосов
/ 29 августа 2013

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

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView {
    mapView.userTrackingMode = MKUserTrackingModeFollowWithHeading;
}
3 голосов
/ 20 ноября 2011

У меня тоже такая же проблема.Не удается найти в заголовке карты никакой информации о том, что она не работает или не работает в этом отношении.

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

Также обратите внимание, что симулятор iOS в настоящее время не позволяет имитировать заголовок.

0 голосов
/ 08 января 2014

Итак, причина возникновения этой ошибки:

UIMapView is not loaded yet in the viewDidLoad.

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

Так что не рекомендуется помещать его в mapViewDidFinishLoadingMap.

Окончательное решение:

Создайте приватное логическое значение и установите для него значение false в viewDidLoad

BOOL _didFollowUserAlready;

Установите делегата mapview на self и добавьте этот метод:

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    if(!_didFollowUserAlready)
    {
        _didFollowUserAlready = TRUE;
        [mapView setUserTrackingMode:MKUserTrackingModeFollow animated:TRUE];
    }
}
0 голосов
/ 29 августа 2012

У меня тоже была эта проблема.Несмотря на то, что я уже установил showUserLocation в YES, а userTrackingMode в MKUserTrackingModeFollowWithHeading в -viewDidLoad, заголовок по-прежнему отображался только время от времени.После проверки «Показывает местоположение пользователя» в наконечнике, а также перемещения setUserTrackingMode: to -viewDidAppear, он начал последовательно показывать заголовок.Я бы сказал, что -viewDidLoad вызывается слишком рано для mapView.Не уверен, почему, хотя.

0 голосов
/ 16 августа 2012

Может ли быть так, что его называют слишком рано?попробуйте выполнить вызов setUserTrackingMode в методе viewDidAppear и убедитесь, что вы не установили другое значение в Интерфейсном Разработчике (графическая часть Xcode)

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