MapView возвращается в исходное положение — помогите!

У меня есть mapView с пользовательскими аннотациями, и я столкнулся с проблемой на iPhone бета-тестера. MapView не позволит пользователю перемещаться в какое-либо место... как только вы попытаетесь переместиться, он вернется к исходным координатам.

Есть идеи, почему? Этого не происходит в симуляторе, и я немного замечаю это на своем собственном устройстве... но это постоянная проблема на другом устройстве.

Спасибо большое!

static BOOL haveAlreadyReceivedCoordinates = NO;

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation  {
    if(haveAlreadyReceivedCoordinates) {
    return;
    }

    haveAlreadyReceivedCoordinates = YES;

    CLLocationCoordinate2D loc = [newLocation coordinate];
    [mapView setCenterCoordinate:loc];
}

person Adam Storr    schedule 09.02.2011    source источник
comment
У меня такое было однажды. Проверьте свои методы делегирования. Я предполагаю, что где-то в didUpdateToLocation вы говорите ему вернуться... в противном случае опубликуйте какой-нибудь код....   -  person Icky    schedule 09.02.2011
comment
Привет, Ики... Я обновил свой вопрос, включив в него свой код. Должен ли я просто включить stopUpdatingLocation после того, как закончу, чтобы избежать постоянного перемещения?   -  person Adam Storr    schedule 10.02.2011


Ответы (1)


Ики поставил тебя на правильный путь. Вы не должны постоянно сбрасывать центр карты на то, что вы получаете от менеджера местоположения. Менеджер местоположения будет присылать вам всевозможные обновления.

Вы можете использовать обновление только один раз, а затем игнорировать будущие обновления (установив какой-либо флаг), или вы можете центрировать карту на местоположении пользователя только тогда, когда пользователь нажимает кнопку. В последнем случае единственное, что вам нужно сделать в didUpdateToLocation:, это сохранить новое местоположение в какой-либо переменной-члене.

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

person nss    schedule 10.02.2011
comment
Спасибо нс! Это имеет гораздо больше смысла. Теперь мой вопрос: почему моя карта будет продолжать использовать новое местоположение? Или как сделать так, чтобы моя карта использовала ее только один раз? - person Adam Storr; 10.02.2011
comment
Итак, карта использует новое местоположение, потому что вы указали это в didUpdateToLocation. Что вы можете сделать, так это сохранить логическую переменную-член (скажем, mapLocationUpdated), которая изначально ложна. В didUpdateToLocation вы должны вызвать [mapView setCenterCoordinate:loc] only if mapLocationUpdated` is false. После этого установите mapLocationUpdated в true. В качестве альтернативы вы можете просто сказать диспетчеру местоположения прекратить обновлять местоположение в didUpdateToLocation после того, как вы разобрались с ним один раз. - person nss; 10.02.2011
comment
Спасибо нс! Меня очень привлекает использование опции логического значения. Как мне сказать didUpdateToLocation обновлять только в том случае, если оно ложно? - person Adam Storr; 12.02.2011
comment
Я только что обновил свой вопрос с опцией логического значения. Он отлично работает, когда я сначала захожу на вкладку карты ... но при повторном посещении местоположение не работает ... как я могу это исправить? - person Adam Storr; 13.02.2011
comment
Все исправлено... Я добавил логическое значение в viewWillAppear... Спасибо, nss! - person Adam Storr; 13.02.2011
comment
Извините, что не вернулся к вам раньше. Я рад, что у тебя все получилось. Да, вы можете сбросить логическое значение в false в viewWillAppear. И последний совет: сделайте haveAlreadyReceivedCoordinates переменной-членом вашего класса, а не статической глобальной. Таким образом, вы можете справиться с двумя экземплярами класса, не мешая им. - person nss; 16.02.2011