MKMapView regionDidChangeAnimated вызывается действием пользователя или программой - PullRequest
2 голосов
/ 10 ноября 2011

У меня есть MKMapView с некоторыми аннотациями в нем.Теперь каждый раз, когда меняется регион, я загружаю новые аннотации.Это работает нормально, но если какая-то аннотация находится рядом с границей вида карты, и вы нажимаете на нее, выскакивает информационное окно аннотации, и область mkmapview немного смещается (так, чтобы она могла красиво показать окно), но проблема в том, чтотакже вызывается regionDidChangeAnimated, который перезагружает все мои аннотации и, конечно, скрывает информационное окно.Я знаю, что вы можете просто нажать аннотацию еще раз, когда она перезагружается, но для пользователя она кажется сломанной, а также вы перезагружаете аннотации, когда вам это не нужно.Есть ли способ проверить, вызван ли regionDidChangeAnimated из-за действия пользователя или программно?Спасибо.

Ответы [ 3 ]

5 голосов
/ 10 ноября 2011

Когда отмечается аннотация рядом с краем вида карты, и она перемещает карту в соответствии с выноской, последовательность событий:

  1. regionWillChangeAnimated называется
  2. didSelectAnnotationView называется
  3. regionDidChangeAnimated называется

Используя два флага BOOL ivar, вы можете наблюдать за этой последовательностью и предотвратить повторную загрузку аннотаций в regionDidChangeAnimated,

Например:

-(void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    regionWillChangeAnimatedCalled = YES;
    regionChangedBecauseAnnotationSelected = NO;
}

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    regionChangedBecauseAnnotationSelected = regionWillChangeAnimatedCalled;
}

-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    if (!regionChangedBecauseAnnotationSelected) //note "!" in front
    {
        //reload (add/remove) annotations here...
    }

    //reset flags...
    regionWillChangeAnimatedCalled = NO;
    regionChangedBecauseAnnotationSelected = NO;
}
1 голос
/ 10 ноября 2011

Вы удаляете все аннотации и добавляете новые в своем методе regionDidChangeAnimated? Я думаю, что более надежное решение - отслеживать все аннотации, которые вы добавили на карту, используя словарь и некоторый уникальный идентификатор в качестве ключа (который не изменится, идентификатор базы данных и т. Д.). Затем в вашем методе regionDidChangeAnimated вы добавляете только новые и, возможно, удаляете аннотации за пределами региона.

0 голосов
/ 17 апреля 2014

Может оказаться, что удобнее связывать загрузку новых аннотаций с UIGestureRecognizer, поэтому вы загружаете новые аннотации только тогда, когда знаете, что пользователь прокрутил карту вручную.Это также может предотвратить перезагрузку при повороте устройства.См. Ответ Яно на , чтобы определить, был ли MKMapView перетащен / перемещен .

...