Нестабильное поведение showUserLocation в MKMapView - PullRequest
2 голосов
/ 19 декабря 2011

У меня есть MKMapView с MKUserTrackingBarButtonItem. Текущее местоположение пользователя должно отображаться только в режимах Follow или FollowWithHeading. Реализация выглядит так:

- (void)mapView:(MKMapView *)mapView 
didChangeUserTrackingMode:(MKUserTrackingMode)mode 
       animated:(BOOL)animated
{
    [mapView setShowsUserLocation:(mode != MKUserTrackingModeNone)]; 
}

Это единственное место в моем коде, где вызывается setShowsUserLocation, и оно работает, как и ожидалось, когда нажата MKUserTrackingBarButtonItem.

Моя проблема возникает при изменении UserTrackingMode путем перетаскивания карты: в этом случае аннотация «синяя точка» исчезает, как и предполагалось, но примерно в 20% случаев она появляется после завершения перетаскивания.

Если я затем проверяю свойство карты showsUserLocation, оно всегда имеет значение NO, даже если заметка «синяя точка» видна.

Буду очень признателен за помощь, если вы знаете, как решить эту проблему.

1 Ответ

1 голос
/ 19 декабря 2011

Похоже, если обновление местоположения пользователя происходит в определенное время во время перетаскивания, метод делегата didUpdateUserLocation все еще срабатывает, и синяя точка снова появляется, даже если showsUserLocation равно NO.

Это, похоже, недостаток вида карты.

Переключение showsUserLocation в didUpdateUserLocation, кажется, исправляет внутреннее состояние представления карты, и синяя точка исчезает:

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    if (!mapView.showsUserLocation)
    {
        mapView.showsUserLocation = YES;
        mapView.showsUserLocation = NO;
    }
}
...