ShowUserLocation не отображает синюю точку в iPhone 4.0

Итак, я создал CLLocationManager, вызвал его, чтобы начать обновление, установил для mapView.showsUserLocation значение YES и вернул nil для аннотации userLocation. Вот несколько фрагментов моего кода в UIMapViewController:

- (void)viewDidLoad
{
     CLLocationManager *locationManager = [[CLLocationManager alloc] init];
     [locationManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{ 
 CLLocationCoordinate2D userCoordinate = locationManager.location.coordinate;
 [map setCenterCoordinate:userCoordinate animated:YES];
 [map setShowsUserLocation:YES];  
}

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{

 MKAnnotationView *mapIconView = (MKAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:@"mapIconView"];

 // Don't mess with the user location annotation
     if (annotation == mapView.userLocation)
              return nil;

    // etc.
}     

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

mapView.setUserLocation = YES;

Что мне здесь не хватает?


person Aeonaut    schedule 23.08.2010    source источник


Ответы (5)


Когда я это делаю, вместо того, чтобы проверять annotation, как вы, я делаю что-то вроде:

if([annotation class] == MKUserLocation.class) {
    return nil;
}
person dc.    schedule 24.08.2010
comment
Спасибо, но это, похоже, ничего не меняет. По-прежнему нет точки. Я могу пройтись по коду и посмотреть {return nil; } вызывается, поэтому я не думаю, что проблема в этом. - person Aeonaut; 24.08.2010
comment
Это очень хороший момент. UserLocation вида карты изначально равен нулю, поэтому лучше проверить класс аннотации, а не сравнивать его с mapView.userLocation. - person spstanley; 09.01.2011

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

Как и в моей проблеме, ваш код выглядит так, как будто он обрабатывает обновления местоположения и просит MKMapView отслеживать местоположение пользователя. Обратите внимание, что в симуляторе это два разных места! Когда MKMapView отслеживает местоположение пользователя в симуляторе, он дает вам местоположение Apple в Купертино, Калифорния, независимо от вашего «фактического» местоположения.

Используя этот код и позволяя MKMapView отслеживать местоположение вашего делегата вместо того, чтобы отслеживать местоположение самостоятельно, можно выявить синюю точку:

- (void)mapView:(MKMapView *)theMapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    [theMapView setCenterCoordinate:userLocation.location.coordinate animated:YES];
}

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

person spstanley    schedule 09.01.2011
comment
все правильно: в симуляторе Core Location использует ваше фактическое местоположение (на основе вашего IP-адреса и т. д.), но MapKit использует Купертино, Калифорния, в качестве вашего текущего местоположения. Если вы нарисуете карту с центром в вашем основном местоположении, вы не увидите синюю точку, если не уменьшите масштаб, чтобы увидеть Северную Калифорнию. Тем не менее, он будет нормально работать на устройстве. - person Matthew Frederick; 09.01.2011

Это mapView.showUserLocation = YES;

Похоже, вы использовали неправильный оператор set вместо show.

И, к вашему сведению, вам не нужно связываться с менеджером местоположения только для того, чтобы узнать местоположение пользователя. Corelocation запускается автоматически, когда вы устанавливаете mapview.showUserLoction = YES и загружаете карту.

Надеюсь, поможет :)

person swapnil    schedule 01.10.2010
comment
Он использует метод установки свойства, чтобы установить значение, что совершенно верно. Он делает именно то, что mapView.showUserLocation = YES; делает, спасибо Obj-C 2.0! - person spstanley; 09.01.2011

Убедитесь, что вы нигде не удаляете все аннотации с карты:

например [mapView removeAnnotations: mapView.annotations]

person Matt Green    schedule 19.06.2013

Если вы используете симулятор iOS, вы не увидите синюю точку. У меня была точно такая же проблема, и когда я начал пробовать свое программное обеспечение на реальном оборудовании, появилась синяя точка!

person Krismutt    schedule 26.12.2010
comment
Это связано с тем, что в симуляторе пользовательское местоположение вида карты всегда устанавливается на N 19º 19.901, W 122º 01.827, независимо от вашего фактического местоположения (как определено вашим адресом в Интернете, кстати). - person spstanley; 09.01.2011
comment
Да, я знаю. Я просто хотел сказать, что если он тестирует в симуляторе, то на самом деле он не может видеть текущее местоположение с синей точкой. Все чисто? - person Krismutt; 10.01.2011